题意:数独问题
这个题思路很好想,但是在判断3*3小区域的时候出现了错误。写的时候还是稳一些吧,要不然调的时候会吐血的。
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=10; 7 int array[maxnum][maxnum]; 8 bool flag; 9 int cur; 10 struct pos 11 { 12 int x; 13 int y; 14 }pos[82]; 15 16 bool judge(int x,int y,int num) 17 { 18 int i,j; 19 for(i=1;i<=9;i++) 20 if(array[i][y]==num) 21 return false; 22 for(i=1;i<=9;i++) 23 if(array[x][i]==num) 24 return false; 25 int a=(x-1)/3*3+1; //这里出错了,人品啊~ 26 int b=(y-1)/3*3+1; 27 for(i=a;i<=a+2;i++) 28 for(j=b;j<=b+2;j++) 29 if(array[i][j]==num) 30 return false; 31 return true; 32 } 33 34 void dfs(int curnum) 35 { 36 int i; 37 if(curnum==0) 38 { 39 flag=true; 40 return ; 41 } 42 int a=pos[curnum].x; 43 int b=pos[curnum].y; 44 //int i; 45 for(i=1;i<=9;i++) 46 { 47 if(judge(a,b,i)) 48 { 49 array[a][b]=i; 50 dfs(curnum-1); 51 if(flag) return ; 52 array[a][b]=0; 53 } 54 55 } 56 } 57 58 int main() 59 { 60 int num; 61 int i,j; 62 char ch; 63 scanf("%d",&num); 64 getchar(); 65 while(num--) 66 { 67 cur=1; 68 flag=false; 69 memset(array,0,sizeof(array)); 70 for(i=1;i<=9;i++) 71 { 72 for(j=1;j<=9;j++) 73 { 74 scanf("%c",&ch); 75 if(ch=='0') 76 { 77 pos[cur].x=i; 78 pos[cur].y=j; 79 cur++; 80 } 81 else 82 array[i][j]=ch-'0'; 83 } 84 if(j==10) 85 getchar(); 86 } 87 88 dfs(cur-1); 89 for(i=1;i<=9;i++) 90 { 91 for(j=1;j<9;j++) 92 printf("%d",array[i][j]); 93 if(j==9) 94 printf("%d\n",array[i][j]); 95 } 96 } 97 return 0; 98 } 99 100 /* 101 1 102 100628579 103 572139468 104 986754231 105 391542786 106 468917352 107 725863914 108 237481695 109 619275843 110 854396127 111 */
tju oj 1851