E - Sudoku HDU - 5547 (搜索+暴力)
题目链接: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 }