首先,英文题面,看着就很难受,翻译起来就更难受了T^T,第一次读题时足足翻译了半个多小时,翻译完后又和百度翻译对照了一下,有很多地方都翻译错了,心态爆炸,不但题不会做,题解也看不下去(莫名烦躁而感觉看不懂)。缓了一天才缓过来。。。
题目的意思是给出四行四列字符串,判断能否把所有的b换成w或把所有的w换成b
这个题是一个简单的dfs题,一共有十六个字符,只要用dfs不点判断各种情况后取出最小的答案即可。由于粗心,一个for循环里的"<“打成了”>",卡了好长时间T^T
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char arr[10][10];
int ans=100;
bool right() //判断是否满足条件(完全转换)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(arr[i][j]!=arr[0][0])
{
return false;
}
}
}
return true;
}
void mmp(int a,int b) //转换字符,下面的dfs要用到
{
if(a>=0||a<4||b>=0||b<4)
{
if(arr[a][b]=='w')
arr[a][b]='b';
else if(arr[a][b]=='b')
arr[a][b]='w';
}
else return;
}
void dfs(int x,int y,int num)
{
if(right()) //如果可以,更新答案为当前最小值
{
ans=min(ans,num);
//cout<<ans<<endl;
return;
}
if(x==4)
return ;
mmp(x,y); //改变状态
mmp(x+1,y);
mmp(x,y-1);
mmp(x-1,y);
mmp(x,y+1);
if(y==3) //判断对当前行的下一列dfs还是对下一行的第一列dfs
{
dfs(x+1,0,num+1);
}
else
{
dfs(x,y+1,num+1);
}
mmp(x,y); //回溯
mmp(x+1,y);
mmp(x,y-1);
mmp(x-1,y);
mmp(x,y+1);
if(y==3) //不转换并dfs
{
dfs(x+1,0,num);
}
else
{
dfs(x,y+1,num);
}
}
int main()
{
ans=100;
for(int i=0;i<4;i++) //输入题目所给字符
{
for(int j=0;j<4;j++)
{
cin>>arr[i][j];
}
}
dfs(0,0,0); //进行dfs
if(ans<=16) //由于要转换的字符最多为十六个,说以只要ans<=16即为正确答案
cout<<ans;
else
cout<<"Impossible";
return 0;
}