生活随笔
收集整理的這篇文章主要介紹了
HDU 1426 Sudoku Killer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數獨(DFS)。
非常憂傷的一道題,先是剪枝的三個數組開成[9][9]導致 越界了WA。
然后就是每兩組輸出之間有空行,可是最后一組后面不能輸出空行。PE好多次。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FORi(n) for(int i=0;i<n;i++)
#define FORj(n) for(int j=0;j<n;j++)
#define FORk(n) for(int k=0;k<n;k++)
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)#define SIZE 1000+10
using namespace std;int g[9][9];
bool visx[9][10],visy[9][10],box[9][10];
void show()
{FORi(9){FORj(8)printf("%d ",g[i][j]);printf("%d\n",g[i][8]);}
}
void dfs(int n)
{if(n>80)show();else{int i=n/9,j=n%9;if(!g[i][j]){for(int k=1; k<=9; k++)if(!visx[i][k]&&!visy[j][k]&&!box[i/3*3+j/3][k]){g[i][j]=k;visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=1;dfs(n+1);g[i][j]=0;visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=0;}}elsedfs(n+1);}
}
int main()
{char ch[5];bool flag=0;while(~scanf("%s",ch)){CLR(visx,0);CLR(visy,0);CLR(box,0);if(ch[0]>='1'&&ch[0]<='9')g[0][0]=ch[0]-'0';else if(ch[0]=='?')g[0][0]=0;if(g[0][0])visx[0][g[0][0]]=visy[0][g[0][0]]=box[0][g[0][0]]=1;FORi(9)FORj(9){if(i==0&&j==0)continue;scanf("%s",ch);if(ch[0]>='1'&&ch[0]<='9')g[i][j]=ch[0]-'0';else if(ch[0]=='?')g[i][j]=0;if(g[i][j])visx[i][g[i][j]]=visy[j][g[i][j]]=box[i/3*3+j/3][g[i][j]]=1;}if(!flag)flag=1;else printf("\n");dfs(0);}
}
轉載于:https://www.cnblogs.com/gcczhongduan/p/4094346.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的HDU 1426 Sudoku Killer的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。