标签:
Description
Consider the following position as an example:Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题解:枚举翻转次数再暴力搜索。其实是简单题。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char map[5][5];
int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int ans;
bool judge() //全部同色
{
for(int i = 0;i < 4;i++)
{
for(int j = 0;j < 4;j++)
{
if(map[i][j] != map[0][0])
{
return false;
}
}
}
return true;
}
void flip(int n) //翻转
{
int x;
int y;
if(n % 4 == 0) //把n看做是格子是第几个,就是把格子看成第1-16个(编号),
{ //此时可以得到坐标和编号的关系
x = n / 4 - 1;
}
else
{
x = n / 4;
}
y = n - 4 * x - 1;
map[x][y] = (map[x][y] == 'b' ? 'w' : 'b');
for(int i = 0;i < 4;i++)
{
int xx = x + d[i][0];
int yy = y + d[i][1];
if(xx >= 0 && xx < 4 && yy >= 0 && yy < 4)
{
map[xx][yy] = (map[xx][yy] == 'b' ? 'w' : 'b');
}
}
}
bool dfs(int t,int s,int n)
{
if(n > 16) //只能翻转16个
{
return false;
}
if(s == t) //翻转次数到了
{
if(judge()) //全部颜色一致??
{
return true;
}
return false;
}
flip(n + 1); //翻转
if(dfs(t,s + 1,n + 1)) //表示翻转
{
return true;
}
flip(n + 1); //翻转回去,下面表示不翻转该点
if(dfs(t,s,n + 1))
{
return true;
}
return false;
}
int main()
{
while(scanf("%s",map[0]) != EOF)
{
for(int i = 1;i < 4;i++)
{
scanf("%s",map[i]);
}
bool flag = true;
for(int i = 0;i < 4;i++)
{
for(int j = 0;j < 4;j++)
{
if(map[0][0] != map[i][j])
{
flag = false;
break;
}
}
}
if(flag)
{
printf("0\n");
continue;
}
flag = true;
for(int i = 1;i <= 16;i++)
{
if(dfs(i,0,0)) //i表示翻转次数,0表示翻转了几次,0表示翻转的是第几个
{
printf("%d\n",i);
break;
}
if(i == 16)
{
flag = false;
}
}
if(!flag)
{
printf("Impossible\n");
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wang2534499/article/details/47615805