标签:
H - Sudoku
Time Limit: 1 Sec
Memory Limit: 256 MB
无
3 **** 2341 4123 3214 *243 *312 *421 *134 *41* **3* 2*41 4*2*
Sample Output
Case #1: 1432 2341 4123 3214 Case #2: 1243 4312 3421 2134 Case #3: 3412 1234 2341 4123
题意
让你找到一个4*4的数独的合法解
题解:
直接爆搜就能过
代码:
#include<stdio.h> #include<iostream> #include<math.h> using namespace std; string s[5]; int p[5][5]; int tx[20]; int ty[20]; int tot = 0; int flag; int vis[5]; int check() { for(int i=0;i<4;i++) { vis[1]=vis[2]=vis[3]=vis[4]=0; for(int j=0;j<4;j++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } for(int j=0;j<4;j++) { vis[1]=vis[2]=vis[3]=vis[4]=0; for(int i=0;i<4;i++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } vis[1]=vis[2]=vis[3]=vis[4]=0; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } vis[1]=vis[2]=vis[3]=vis[4]=0; for(int i=2;i<4;i++) { for(int j=0;j<2;j++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } vis[1]=vis[2]=vis[3]=vis[4]=0; for(int i=0;i<2;i++) { for(int j=2;j<4;j++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } vis[1]=vis[2]=vis[3]=vis[4]=0; for(int i=2;i<4;i++) { for(int j=2;j<4;j++) { if(p[i][j]==0)continue; if(vis[p[i][j]])return 0; vis[p[i][j]]=1; } } return 1; } void dfs(int x) { if(flag)return; if(x==tot){ for(int i=0;i<4;i++) { for(int j=0;j<4;j++) printf("%d",p[i][j]); printf("\n"); } flag=1; return;} for(int i=1;i<=4;i++) { p[tx[x]][ty[x]]=i; if(check()) dfs(x+1); p[tx[x]][ty[x]]=0; } } int main() { int t;scanf("%d",&t); for(int cas = 1;cas <= t;cas++) { tot = 0; flag = 0; for(int i=0;i<4;i++) cin>>s[i]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(s[i][j]==‘*‘) p[i][j]=0; else p[i][j]=s[i][j]-‘0‘; for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(p[i][j]==0) { tx[tot]=i; ty[tot]=j; tot++; } printf("Case #%d:\n",cas); dfs(0); } }
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4899360.html