***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字
思路:DFS暴力搜索, 每个位置填1—4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出答案***
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef long long LL; #define N 1001000 #define INF 0x3f3f3f char maps[10][10]; int judge(int row, int col) { for(int i=0; i<4; i++) { if(maps[row][i]==maps[row][col]&&i!=col) return 0; } for(int i=0; i<4; i++) { if(maps[i][col]==maps[row][col]&&i!=row) return 0; } int Row, Col; if(row%2==1) Row=row-1; else Row=row; if(col%2==1) Col=col-1; else Col=col; for(int i=Row; i<=Row+1; i++) { for(int j=Col; j<=Col+1; j++) { if(maps[i][j]==maps[row][col]&&i!=row&&j!=col) return 0; } } return 1; } void DFS(int t) { if(t==16) { for(int i=0; i<4; i++) puts(maps[i]); return ; } int row=t/4;//行列转换方法,知道如何转换,就可以运用递归去求解了 int col=t%4; if(maps[row][col]==‘*‘) { for(int i=1; i<=4; i++) { maps[row][col]=i+‘0‘; if(judge(row, col)) DFS(t+1); maps[row][col]=‘*‘; } } else DFS(t+1); } int main() { int T, cas=1; scanf("%d", &T); while(T--) { for(int i=0; i<4; i++) scanf("%s", maps[i]); printf("Case #%d:\n", cas++); DFS(0); } return 0; }
时间: 2024-10-01 02:27:15