DFS/POJ 2676 Sudoku

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 bool v[10][10],row[10][10],col[10][10],used[4][4][10];
 5 int a[10][10];
 6 bool flag;
 7 void dfs(int x,int y)
 8 {
 9     if (flag) return ;
10     if (x>9)
11     {
12         for (int i=1;i<=9;i++)
13         {
14             for (int j=1;j<=9;j++) printf("%d",a[i][j]);
15             printf("\n");
16         }
17         flag=true;
18         return;
19     }
20 
21     if (v[x][y]==1)
22     {
23         if (y==9) dfs(x+1,1);
24         else dfs(x,y+1);
25     }
26     else
27     {
28         v[x][y]=1;
29         for (int i=1;i<=9;i++)
30             if (row[x][i]==0 && col[y][i]==0 && used[(x-1)/3+1][(y-1)/3+1][i]==0)
31             {
32                 a[x][y]=i;
33                 row[x][i]=1;
34                 col[y][i]=1;
35                 used[(x-1)/3+1][(y-1)/3+1][i]=1;
36                 if (y==9) dfs(x+1,1);else dfs(x,y+1);
37                 a[x][y]=0;
38                 row[x][i]=0;
39                 col[y][i]=0;
40                 used[(x-1)/3+1][(y-1)/3+1][i]=0;
41             }
42         v[x][y]=0;
43     }
44 }
45 
46 int main()
47 {
48     int n;
49     scanf("%d",&n);
50     for (int t=1;t<=n;t++)
51     {
52         memset(a,0,sizeof(a));
53         memset(v,0,sizeof(v));
54         memset(row,0,sizeof(row));
55         memset(col,0,sizeof(col));
56         memset(used,0,sizeof(used));
57         for(int i=1;i<=9;i++)
58         {
59             char str[10];
60             scanf("%s",str);
61             for (int j=0;j<9;j++)
62             {
63                 a[i][j+1]=str[j]-'0';
64                 if (a[i][j+1]!=0)
65                 {
66                     v[i][j+1]=1;
67                     int x=a[i][j+1];
68                     row[i][x]=1;
69                     col[j+1][x]=1;
70                     used[(i-1)/3+1][(j+1-1)/3+1][x]=1;
71                 }
72             }
73         }
74 /*
75         for (int i=1;i<=9;i++)
76         {
77             for (int j=1;j<=9;j++) printf("%d ",row[i][j]);
78             printf("\n");
79         }
80 */
81         flag=false;
82         dfs(1,1);
83     }
84     return 0;
85 }

 

转载于:https://www.cnblogs.com/NicoleLam/p/4150161.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值