判断函数写的稍微有些复杂,可以参考其他的判断函数
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bool flag;
char graph[5][5];
int a[4][4] = {{0,1,4,5},{2,3,6,7},{8,9,12,13},{10,11,14,15}};
bool judge(int idx){ //判断idx位的数字放置方式是否满足条件
int row = idx/4 , col = idx%4;
char ch = graph[row][col];
//同一行
for(int j=0;j<4;j++){
if(j!=col && graph[row][j]==ch){
return false;
}
}
//同一列
for(int i=0;i<4;i++){
if(i!=row && graph[i][col]==ch){
return false;
}
}
//同一个2*2格子
if(idx==0 || idx==1 || idx==4 || idx==5){
for(int i=0;i<4;i++){
int t = a[0][i];
if(t!=idx && graph[t/4][t%4]==graph[row][col]){
return false;
}
}
}
else if(idx==2 || idx==3 || idx==6 || idx==7){
for(int i=0;i<4;i++){
int t = a[1][i];
if(t!=idx && graph[t/4][t%4]==graph[row][col]){
return false;
}
}
}
else if(idx==8 || idx==9 || idx==12 || idx==13){
for(int i=0;i<4;i++){
int t = a[2][i];
if(t!=idx && graph[t/4][t%4]==graph[row][col]){
return false;
}
}
}
else if(idx==10 || idx==11 || idx==14 || idx==15){
for(int i=0;i<4;i++){
int t = a[3][i];
if(t!=idx && graph[t/4][t%4]==graph[row][col]){
return false;
}
}
}
return true;
}
void dfs(int idx){
if(idx==16){
flag = true;
for(int i=0;i<4;i++)
printf("%s\n",graph[i]);
return ; //达到目标状态
}
if(flag) return;
int row = idx/4 , col = idx%4;
if(graph[idx/4][idx%4]=='*'){ //只有当前位置为*才需要放置数字
for(int i=1;i<=4;i++){ //在当前位置考虑4种数字的放置方法
graph[row][col] = i+'0';
if(judge(idx)){
dfs(idx+1);
}
graph[row][col] = '*';
}
}
else{
dfs(idx+1);
}
}
int main(){
int t;
int cnt = 1;
scanf("%d",&t);
while(t--){
flag = false;
for(int i=0;i<4;i++){
scanf("%s",graph[i]);
}
printf("Case #%d:\n",cnt++);
dfs(0);
// for(int i=0;i<4;i++)
// printf("%s\n",graph[i]);
}
return 0;
}