数独(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; } } else dfs(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); } }
原文地址:http://blog.csdn.net/dongshimou/article/details/39339087