一个数读题目;
每次遇到一个“*”我们就枚举他变成1,2,3,4然后判断是否合法,如果合法就进行下一个点,否则回溯。
还是很简单的思路,但是自己做的时候还是没有想到,对于dfs还是不够敏感
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=105;
char tu[6][6];
int vis[6][6];
int ju(int x,int y)
{
for(int i=0;i<4;i++)//
{
if(tu[x][i]==tu[x][y]&&i!=y)
return 0;
}
for(int i=0;i<4;i++)
{
if(tu[i][y]==tu[x][y]&&i!=x)//
return 0;
}
int my=y;
int mx=x;
if(my%2==1) my--;
if(mx%2==1) mx--;
for(int i=mx;i<=mx+1;i++)//
{
for(int j=my;j<=my+1;j++)
{
if(tu[i][j]==tu[x][y]&&i!=x&&j!=y)
return 0;
}
}
return 1;
}
void dfs(int x)
{
if(x==4*4)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
cout<<tu[i][j];
}
cout<<endl;
}
return;
}
else
{
int r=x/4;//行
int c=x%4;//列;
if(tu[r][c]=='*')
{
for(int i=0;i<4;i++)
{
tu[r][c]=i+'1';
if(ju(r,c))
dfs(x+1);
}
tu[r][c]='*';
}
else
{
dfs(x+1);
}
}
}
int main()
{
int T;
int kase=0;;
cin>>T;
while(T--)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cin>>tu[i][j];
cout<<"Case #"<<++kase<<":"<<endl;
dfs(0);
}
return 0;
}