hdu Sudoku Killer
简单的dfs,主要就是每个?处填的值是否满足条件的判断。这道题感觉考察的是输出格式的控制。
#include"iostream" #include"stdio.h" #include"algorithm" #include"cmath" #include"string.h" #include"string" #define mx 1005 using namespace std; int shudu[100][100]; int num,icase; bool flag; struct node { int x,y; }position[mx]; bool check(int num,int cur) { int i,j; for(i=0;i<9;i++) { if(i==position[cur].x) continue; if(num==shudu[i][position[cur].y]) return false; } for(j=0;j<9;j++) { if(j==position[cur].y) continue; if(num==shudu[position[cur].x][j]) return false; } int xx=position[cur].x,yy=position[cur].y; xx=(xx/3)*3;yy=(yy/3)*3; for(i=xx;i<xx+3;i++) { for(j=yy;j<yy+3;j++) { if(i==position[cur].x&&j==position[cur].y) continue; if(num==shudu[i][j]) return false; } } return true; } void dis() { if(icase++) cout<<endl; for(int i=0;i<9;i++) { cout<<shudu[i][0]; for(int j=1;j<9;j++) cout<<' '<<shudu[i][j]; cout<<endl; } } void dfs(int step) { if(flag) return; if(step==num) { dis(); flag=true; return; } for(int i=1;i<=9;i++) { if(check(i,step)) { shudu[position[step].x][position[step].y]=i; dfs(step+1); shudu[position[step].x][position[step].y]=0; } } } int main() { int i,j; icase=0; char s[3]; while(scanf("%s",s)!=EOF) { flag=false; num=0; if(s[0]=='?') { position[num].x=0;position[num++].y=0;shudu[0][0]=0; } else shudu[0][0]=s[0]-'0'; for(i=0;i<9;i++) { for(j=0;j<9;j++) { if(i==0&&j==0) continue; scanf("%s",s); if(s[0]=='?') { position[num].x=i;position[num++].y=j;shudu[i][j]=0; } else { shudu[i][j]=s[0]-'0'; } } } dfs(0); } return 0; }