标签:搜索
Description
Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
这道题可以用深搜,题意是补完数独中的空格数,0代表空格。用了三个剪枝,同行,同列还有同一个大格子的数字不能重复。
#include<stdio.h> #include<string.h> char s[12][12]; int row[12][12],col[12][12],dage[12][12],map[12][12],flag; void dfs(int x,int y) { int i,j,k; if(x==10){ flag=1;return; } if(map[x][y]!=0){ if(y==9){ dfs(x+1,1); } else dfs(x,y+1); if(flag)return; } else if(map[x][y]==0){ k=(x-1)/3*3+(y-1)/3+1; for(i=1;i<=9;i++){ if(row[x][i]==0 && col[y][i]==0 && dage[k][i]==0){ map[x][y]=i; row[x][i]=1;col[y][i]=1;dage[k][i]=1; if(y==9){ dfs(x+1,1); } else dfs(x,y+1); if(flag==1)return; map[x][y]=0;row[x][i]=0;col[y][i]=0;dage[k][i]=0; } } } } int main() { int n,m,i,j,T,k,flag1; scanf("%d",&T); while(T--) { memset(row,0,sizeof(row));memset(col,0,sizeof(col));memset(dage,0,sizeof(dage));memset(map,0,sizeof(map)); flag1=1; for(i=1;i<=9;i++){ scanf("%s",s[i]+1); for(j=1;j<=9;j++){ map[i][j]=s[i][j]-‘0‘; k=(i-1)/3*3+(j-1)/3+1; if(map[i][j]!=0){ if(row[i][map[i][j]]!=0 || col[j][map[i][j]]!=0 || dage[k][map[i][j]]!=0){ flag1=0;break; } row[i][map[i][j]]=1; col[j][map[i][j]]=1; dage[k][map[i][j]]=1; } } if(flag1==0)break; } if(flag1==0){ for(i=1;i<=9;i++){ printf("%s\n",s[i]+1); } } flag=0; dfs(1,1); if(flag==0){ for(i=1;i<=9;i++){ printf("%s\n",s[i]+1); } } else{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ printf("%d",map[i][j]); } printf("\n"); } } } return 0; }
标签:搜索
原文地址:http://blog.csdn.net/kirito_acmer/article/details/45533097