题目链接:https://vjudge.net/problem/Kattis-flowfree
转自:https://blog.csdn.net/deepseazbw/article/details/81281628
题意:把带颜色的块连接起来,要求路径不能重叠且经过所有白色方块。
思路:因为只有16个方格,所以直接dfs。
#include <bits/stdc++.h>
using namespace std;
char s[10][10];
bool flag=false;
int vis[10][10];
bool check(int x,int y)
{
return x>=1&&x<=4&&y>=1&&y<=4;
}
int dir[][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int p[4];
int cnt=0;
void dfs(int x,int y,char ch)
{
cnt++;
vis[x][y]=1;
if(cnt==16)
{
flag=true;
return ;
}
for(int i=0; i<4; i++)
{
int dx=x+dir[i][0],dy=y+dir[i][1];
if(!vis[dx][dy]&&check(dx,dy))
{
if(s[dx][dy]==ch)
{
vis[dx][dy]=1;
cnt++;
if(cnt==16)
{
flag=true;
return;
}
int a,b;
char c;
int f=0;
for(int j=1; j<=4; j++)
{
for(int k=1; k<=4; k++)
{
if(!vis[j][k]&&s[j][k]!='W'&&s[j][k]!=ch)
{
f=1;
a=j;
b=k;
c=s[j][k];
break;
}
}
if(f)
break;
}
if(f)
dfs(a,b,c);
vis[dx][dy]=0;
cnt--;
}
else if(s[dx][dy]=='W')
{
dfs(dx,dy,ch);
}
}
}
cnt--;
vis[x][y]=0;
}
int main()
{
for(int i=1; i<=4; i++)
{
scanf("%s",s[i]+1);
}
int x,y;
char ch;
for(int i=1; i<=4; i++)
{
int f=0;
for(int j=1; j<=4; j++)
{
if(s[i][j]!='W')
{
ch=s[i][j];
x=i,y=j,f=1;
break;
}
}
if(f)
break;
}
dfs(x,y,ch);
if(flag)
{
printf("solvable\n");
}
else
{
printf("not solvable\n");
}
return 0;
}