Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2037 Accepted Submission(s): 618
据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。
所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
例题:
答案:
对于每组测试数据保证它有且只有一个解。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; struct Node { int x,y; }node[100]; int map[10][10]; bool flag; int num; bool check(int k,int t) { for(int i=0;i<9;i++) if(map[node[t].x][i]==k||map[i][node[t].y]==k) return false; int x=(node[t].x/3)*3; int y=(node[t].y/3)*3; for(int i=x;i<x+3;i++) for(int j=y;j<y+3;j++) if(map[i][j]==k) return false; return true; } void DFS(int t) { if(t==num) { for(int i=0;i<9;i++) { for(int j=0;j<8;j++) printf("%d ",map[i][j]); printf("%d\n",map[i][8]); } flag=1; return; } else { for(int i=1;i<=9;i++) { if(check(i,t)&&!flag) { map[node[t].x][node[t].y]=i; DFS(t+1); map[node[t].x][node[t].y]=0; } } } } int main() { bool first=true; char str[10]; while(scanf("%s",&str)!=EOF) { num=0; if(str[0]=='?') { node[num].x=0; node[num++].y=0; map[0][0]=0; } else map[0][0]=str[0]-'0'; for(int i=0;i<9;i++) for(int j=0;j<9;j++) { if(i==0&&j==0)continue; scanf("%s",&str); if(str[0]=='?') { node[num].x=i; node[num++].y=j; map[i][j]=0; } else map[i][j]=str[0]-'0'; } /* for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { printf("%d ",map[i][j]); } printf("\n"); } */ flag=false; if(first) first=false; else printf("\n"); DFS(0); } return 0; }