Sudoku(简单DFS)

故事扮演 提交于 2019-11-26 13:56:19

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5547

数据比较少,直接暴力DFS,检验成立情况即可

AC代码:但是不知道为什么用scanf,printf输入输出就WA了

  1 /* */
  2 # include <iostream>
  3 # include <stdio.h>
  4 # include <string.h>
  5 # include <cstdlib>
  6 # include <cmath>
  7 # include <climits>
  8 # include <deque>
  9 # include <queue>
 10 # include <stack>
 11 # include <vector>
 12 # include <map>
 13 # include <set>
 14 # include <ctime>
 15 # include <functional>
 16 using namespace std;
 17 typedef long long ll;
 18 const int inf=0x3f3f3f3f;
 19 const int maxn=5e4+50;
 20 const ll mod=1e9+7;
 21 char ma[25][25];
 22 int vis[25];
 23 int p[25][25];
 24 int tx[20];
 25 int ty[20];
 26 int flag, tot;
 27 
 28 int check()
 29 {
 30     for(int i=0; i<4; i++ )///检查每一行
 31     {
 32         vis[1]=vis[2]=vis[3]=vis[4]=0;
 33         for(int j=0; j<4; j++ )
 34         {
 35             if( p[i][j]==0 )
 36                 continue;
 37             if( vis[p[i][j]] )///填的数重复了不成立
 38                 return 0;
 39             vis[p[i][j]] = 1;
 40         }
 41     }
 42 
 43     for(int j=0; j<4; j++ )///检查每一列
 44     {
 45         vis[1]=vis[2]=vis[3]=vis[4]=0;
 46         for(int i=0; i<4; i++ )
 47         {
 48             if( p[i][j]==0 )
 49                 continue;
 50             if( vis[p[i][j]] )
 51                 return 0;
 52                 vis[p[i][j]] = 1;
 53         }
 54     }
 55 
 56     vis[1] = vis[2] = vis[3] = vis[4] = 0;
 57     for(int i=0; i<2; i++ )///检查左上角的1/4方块
 58     {
 59         for(int j=0; j<2; j++ )
 60         {
 61             if( p[i][j]==0 )
 62                 continue;
 63             if( vis[p[i][j]] )
 64                 return 0;
 65             vis[p[i][j]] = 1;
 66         }
 67     }
 68 
 69     vis[1]=vis[2]=vis[3]=vis[4]=0;
 70     for(int i=0; i<2; i++ )///检查右上角的1/4块
 71     {
 72         for(int j=2; j<4; j++ )
 73         {
 74             if( p[i][j]==0 )
 75                 continue;
 76             if( vis[p[i][j]] )
 77                 return 0;
 78             vis[p[i][j]] = 1;
 79         }
 80     }
 81 
 82     vis[1] = vis[2] = vis[3] = vis[4]=0;
 83     for(int i=2; i<4; i++ )///检查左下角1/4块
 84     {
 85         for(int j=0; j<2; j++ )
 86         {
 87             if( p[i][j]==0 )
 88                 continue;
 89             if( vis[p[i][j]] )
 90                 return 0;
 91             vis[p[i][j]] = 1;
 92         }
 93     }
 94 
 95     vis[1] = vis[2] = vis[3] = vis[4] = 0;
 96     for(int i=2; i<4; i++ )///检查右下角1/4块
 97     {
 98         for(int j=2; j<4; j++ )
 99         {
100             if( p[i][j]==0 )
101                 continue;
102             if( vis[p[i][j]] )
103                 return 0;
104             vis[p[i][j]] = 1;
105         }
106     }
107     return 1;
108 }
109 
110 
111 void dfs(int x)
112 {
113     if( flag )
114         return ;
115     if( x==tot )
116     {
117         for(int i=0; i<4; i++ )
118         {
119             for(int j=0; j<4; j++ )
120             {
121                 cout<<p[i][j];
122                 //printf("%d", p[i][j]);
123             }
124             cout<<endl;
125             //printf("\n");
126         }
127         flag=1;
128         return ;
129     }
130 
131     for(int i=1; i<=4; i++ )
132     {
133         p[tx[x]][ty[x]]=i;
134         if( check())
135         {
136             dfs(x+1);
137         }
138         p[tx[x]][ty[x]] = 0;
139     }
140 }
141 
142 int main()
143 {
144     int t;
145     scanf("%d", &t);
146     int k=1;
147     //getchar();
148     while( t-- )
149     {
150         for(int i=0; i<4; i++ )
151         {
152             for(int j=0; j<4; j++ )
153             {
154                 cin>>ma[i][j];
155                 //scanf("%c", &ma[i][j]);
156             }
157             //getchar();
158         }
159 
160         for(int i=0; i<4; i++ )
161         {
162             for(int j=0; j<4; j++ )
163             {
164                 if( ma[i][j]=='*' )
165                 {
166                     p[i][j] = 0;
167                 }
168                 else
169                     p[i][j] = ma[i][j] - '0';
170             }
171         }
172 
173         flag=0;
174         tot = 0;
175         for(int i=0; i<4; i++ )
176         {
177             for(int j=0; j<4; j++ )
178             {
179                 if( !p[i][j] )
180                 {
181                     /*依次记录空节点的坐标*/
182                     tx[tot] = i;
183                     ty[tot] = j;
184                     tot++;
185                 }
186             }
187         }
188         printf("Case #%d:\n", k++);
189         dfs(0);
190     }
191     return 0;
192 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!