/*poj1753:枚举+DFS用一个计数实现数组元素在深搜时起点的变化 较为常规*/
题意:进行若干次变化,每次可把临近的四个变换颜色,最终能使得正面颜色都相同,输出最少的次数
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int nx[5] = {0, 0, -1, 1};
int ny[5] = {-1, 1, 0, 0};
int MIN = 1000;
void dfs(int n, int k, char str[][5])
{
int sum = 0;
char str1[5][5];
for(int i = 0;i < 4; i++)
{
for(int j = 0;j < 4; j++)
{
if(str[i][j] == 'b')
sum++;
}
}
if(sum == 16 || sum == 0)
{
if(k < MIN)
MIN = k;
return ;
}
if(n == 16)
return;
for(int i = 0;i < 4; i++)
strcpy(str1[i], str[i]);
dfs(n+1, k, str1);
int x = n / 4;
int y = n % 4;
str1[x][y] = (str1[x][y] == 'b')?'w':'b';
for(int i = 0; i<4; i++)
{
int tx = nx[i] + x;
int ty = ny[i] + y;
if(tx>=0&&ty>=0&&tx<=3&&ty<=3)
{
str1[tx][ty] = str1[tx][ty] == 'b'?'w':'b';
}
}
dfs(n+1,k+1,str1);
}
int main()
{
char str[5][5];
for(int i = 0;i < 4; i++)
scanf("%s",str[i]);
dfs(0, 0, str);
if(MIN == 1000)
printf("Impossible\n");
else
printf("%d\n",MIN);
return 0;
}
隔壁一大神写了一个位运算+BFS解法,可以看看,在此附上链接
http://blog.csdn.net/ltyqljhwcm/article/details/52908742