本文共 1177 字,大约阅读时间需要 3 分钟。
数独(DFS)。
非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA。
然后就是每两组输出之间有空行,可是最后一组后面不能输出空行。PE好多次。
#include #include #include #include #include #include #include #include #include #include #include #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 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://iiohx.baihongyu.com/