poj 2676 Sudoku ( dfs )

 dfs 用的还是不行啊,做题还是得看别人的博客!!!

题目:http://poj.org/problem?id=2676

题意:把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。

0是待填位置,其他均为已填入的数字。

要求填完九宫格并输出(如果有多种结果,则只需输出其中一种)

如果给定的九宫格无法按要求填出来,则输出原来所输入的未填的九宫格

参考博客:http://www.cnblogs.com/tanhehe/archive/2013/08/07/3243073.html

http://blog.csdn.net/lyy289065406/article/details/6647977

 r、c、g数组用来剪枝

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<iomanip>
 8 #include<cmath>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 using namespace std;
13 
14 struct node
15 {
16     int x,y;
17 }q[100];
18 int r[10][10],c[10][10],g[4][4][10];
19 int G[10][10],cnt;
20 
21 int dfs(int cn) //表示dfs 递归还是不太会
22 {
23     int x,y;
24     if(cn<0)  return 1;
25     x=q[cn].x; y=q[cn].y;
26     for(int k=1; k<=9; k++)
27     {
28         if(r[x][k] || c[y][k] || g[x/3][y/3][k]) continue;
29         r[x][k]=c[y][k]=g[x/3][y/3][k]=1;
30         G[x][y]=k;
31         if(dfs(cn-1)) return 1;
32         r[x][k]=c[y][k]=g[x/3][y/3][k]=0;
33     }
34     return 0;
35 }
36 int main()
37 {
38     int t,k;
39     cin>>t;
40     while(t--)
41     {
42         cnt=0;
43         memset(r,0,sizeof(r));
44         memset(c,0,sizeof(c));
45         memset(g,0,sizeof(g));
46         for(int i=0; i<9; i++)
47         {
48             for(int j=0; j<9; j++)
49             {
50                 scanf("%1d",&G[i][j]); //每次输入一个整数
51                 k=G[i][j];
52                 if(k!=0)
53                 r[i][k]=c[j][k]=g[i/3][j/3][k]=1; //g数组,每个子网格里是一样的
54                 else
55                 q[cnt++]=(node){i,j}; //赋值到结构体里,学习了
56             }
57         }
58         dfs(cnt-1);
59         for(int i=0; i<9; i++)
60         {
61             for(int j=0; j<9; j++)
62             cout<<G[i][j];
63             printf("\n");
64         }
65     }
66     return 0;
67 }

 

 

posted @ 2013-08-27 15:30  水门  阅读(194)  评论(0编辑  收藏  举报