首页 > 技术文章 > E - Sudoku HDU - 5547 (搜索+暴力)

letlifestop 2018-12-25 15:38 原文

题目链接:https://cn.vjudge.net/problem/HDU-5547

具体思路:对于每一位上,我们可以从1到4挨着去试, 具体判断这一位可不可以的时候,看当前这一位上的行和列有没有冲突,以及他所在的2*2的方格中有没有矛盾的。

AC代码:

  1 #include <iostream>
  2 #include <string>
  3 #include <deque>
  4 #include <stack>
  5 #include<cmath>
  6 #include <algorithm>
  7 #include<cstring>
  8 #include<stdio.h>
  9 #include<map>
 10 using namespace std;
 11 # define ll long long
 12 # define inf 0x3f3f3f3f
 13 # define ll_inf 1ll<<60
 14 const int maxn = 1e6+100;
 15 char a[15][15];
 16 int b[15][15];
 17 int num;
 18 struct node
 19 {
 20     int x;
 21     int y;
 22 } q[100];
 23 bool judge(int s,int t)
 24 {
 25     for(int i=1; i<=4; i++)
 26     {
 27         if(i==q[t].y)
 28             continue;
 29         if(b[q[t].x][i]==s)
 30             return false;
 31     }
 32     for(int i=1; i<=4; i++)
 33     {
 34         if(i==q[t].x)
 35             continue;
 36         if(b[i][q[t].y]==s)
 37             return false;
 38     }
 39     int t1=q[t].x,t2=q[t].y;
 40     if(t1%2==0&&t2%2==0)
 41     {
 42         t1--;
 43         t2--;
 44         for(int i=0; i<=1; i++)
 45         {
 46             for(int j=0; j<=1; j++)
 47             {
 48                 int x=t1+i;
 49                 int y=t2+j;
 50                 if(x==q[t].x&&y==q[t].y)
 51                     continue;
 52                 if(b[x][y]==s)
 53                     return false;
 54             }
 55         }
 56     }
 57     else if(t1%2==0&&t2%2!=0)
 58     {
 59         t1--;
 60         for(int i=0; i<=1; i++)
 61         {
 62             for(int j=0; j<=1; j++)
 63             {
 64                 int x=t1+i;
 65                 int y=t2+j;
 66                 if(x==q[t].x&&y==q[t].y)
 67                     continue;
 68                 if(b[x][y]==s)
 69                     return false;
 70             }
 71         }
 72     }
 73     else if(t1%2!=0&&t2%2==0)
 74     {
 75         t2--;
 76         for(int i=0; i<=1; i++)
 77         {
 78             for(int j=0; j<=1; j++)
 79             {
 80                 int x=t1+i;
 81                 int y=t2+j;
 82                 if(x==q[t].x&&y==q[t].y)
 83                     continue;
 84                 if(b[x][y]==s)
 85                     return false;
 86             }
 87         }
 88     }
 89     else if(t1%2!=0&&t2%2!=0)
 90     {
 91         for(int i=0; i<=1; i++)
 92         {
 93             for(int j=0; j<=1; j++)
 94             {
 95                 int x=t1+i;
 96                 int y=t2+j;
 97                 if(x==q[t].x&&y==q[t].y)
 98                     continue;
 99                 if(b[x][y]==s)
100                     return false;
101             }
102         }
103     }
104     return true;
105 }
106 void dfs(int t)
107 {
108   //  cout<<t<<endl;
109     if(t==num+1)
110     {
111         for(int i=1; i<=4; i++)
112         {
113             for(int j=1; j<=4; j++)
114             {
115                 printf("%d",b[i][j]);
116             }
117             printf("\n");
118         }
119         return ;
120     }
121     for(int i=1; i<=4; i++)
122     {
123         if(judge(i,t))
124         {
125           //  cout<<1<<endl;
126             b[q[t].x][q[t].y]=i;
127             dfs(t+1);
128             b[q[t].x][q[t].y]=0;
129         }
130     }
131 }
132 int main()
133 {
134     int T;
135     scanf("%d",&T);
136     int Case=0;
137     while(T--)
138     {
139         num=0;
140         for(int i=1; i<=4; i++)
141         {
142             scanf("%s",a[i]+1);
143             for(int j=1; j<=4; j++)
144             {
145               //  cout<<a[i][j];
146                 if(a[i][j]=='*')
147                 {
148                     q[++num].x=i;
149                     q[num].y=j;
150                     b[i][j]=0;
151                 }
152                 else
153                     b[i][j]=a[i][j]-'0';
154             }
155         }
156         printf("Case #%d:\n",++Case);
157         dfs(1);
158     }
159     return 0;
160 }

 

推荐阅读