POJ 2676 - Sudoku(数独)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2676 - Sudoku(数独)相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

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

题目大意:

给出一个数字n,表示有n组数据。

每组数据包括一个n*n的数独,0表示未填的数字。数字之间没有空格。

输出填好的数独,使得每行、每列、每个九宫格中的数字都不重复。

 

分析:

经典搜索题目。

数组一定要开大一点,数组一定要开大一点,数组一定要开大一点。

 

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 int notel[150][150],notec[150][150],noteg[150][150],mp[150][150],sum;
 7 //标记   行、          列、            九宫格,        存储地图,  记录空格数目
 8 char tmp;
 9 bool flag;
10 
11 struct SPACE
12 {
13     int x,y;
14 }q[100];
15 //存储空格的相关参数
16 
17 inline void init()
18 {
19     sum = 0;
20     memset(notel,0,sizeof(notel));
21     memset(notec,0,sizeof(notec));
22     memset(noteg,0,sizeof(noteg));
23     memset(mp,0,sizeof(mp));
24     memset(q,0,sizeof(q));
25     flag = false;
26 }
27 
28 inline void out()
29 {
30     for(int i = 1;i <= 9;++ i)
31     {
32         for(int j = 1;j <= 9;++ j)
33             printf("%d",mp[i][j]);
34         puts("");
35     }
36 }
37 
38 void dfs(int l,int c,int step)
39 {
40     if(flag == true) return;
41     if(step == sum+1)
42     {
43         flag = true;
44         out();
45     }
46     if(flag == true) return;
47     int box = 3*((l-1)/3)+((c-1)/3+1);
48     //box存储当前的九宫格标号
49     for(int i = 1;i <= 9;++ i)
50     {
51         if(flag == true) return;
52         if(notel[l][i] == 0 && notec[c][i] == 0 && noteg[box][i] == 0)
53         {
54             notel[l][i] = 1;
55             notec[c][i] = 1;
56             noteg[box][i] = 1;
57             mp[l][c] = i;
58             dfs(q[step+1].x,q[step+1].y,step+1);
59             notel[l][i] = 0;
60             notec[c][i] = 0;
61             noteg[box][i] = 0;
62         }
63     }
64     return;
65 }
66 
67 int main()
68 {
69     int T;
70     scanf("%d",&T);
71     getchar();
72     while(T--)
73     {
74         init();
75         for(int i = 1;i <= 9;++ i)
76         {
77             for(int j = 1;j <= 9;++ j)
78             {
79                 scanf("%c",&tmp),mp[i][j] = tmp-0;
80                 if(mp[i][j])
81                 {
82                     notel[i][mp[i][j]] = 1;
83                     notec[j][mp[i][j]] = 1;
84                     noteg[3*((i-1)/3)+((j-1)/3+1)][mp[i][j]] = 1;
85                 }
86                 else
87                 {
88                     sum++;
89                     q[sum].x = i,q[sum].y = j;
90                 }
91             }
92             getchar();
93         }
94         dfs(q[1].x,q[1].y,1);
95     }
96     return 0;
97 }    

 

以上是关于POJ 2676 - Sudoku(数独)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2676 Sudoku (数独 DFS)

ACM : POJ 2676 SudoKu DFS - 数独

POJ2676 Sudoku - DFS

POJ2676 Sudoku

poj 2676 Sudoku

POJ2676-Sudoku