题目大意:
输入4*4矩阵,每个元素只为‘b'或’w'代表黑或白,规则为每次翻转一个棋子,其周边棋子也被翻转,要求使用最少次数的翻转使矩阵全为黑或者全为白,并输出最少次数;
基本思路:
此题思路与poj2965一致,只是规则略有不同,详见我的博客poj2965;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
int step;
bool flag=false;
char bw[6][6];
bool similar()
{
char c=bw[1][1];
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
if(bw[i][j]!=c)
return false;
}
return true;
}
void change(int x,int y)
{
if(bw[x][y]=='b') bw[x][y]='w';
else bw[x][y]='b';
}
void turn(int x,int y)
{
change(x,y);
if(x>1) change(x-1,y);
if(x<4) change(x+1,y);
if(y>1) change(x,y-1);
if(y<4) change(x,y+1);
}
void dfs(int x,int y,int deep)
{
if(deep==step)
{
flag=similar();
return;
}
if(x>4||flag) return;
turn(x,y);
if(y==4)
{
dfs(x+1,1,deep+1);
turn(x,y);
dfs(x+1,1,deep);
}
else
{
dfs(x,y+1,deep+1);
turn(x,y);
dfs(x,y+1,deep);
}
return;
}