转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://poj.org/problem?id=1753
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------
Description
Consider the following position as an example: Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题意:找出能使4X4的棋盘中的棋子同色的最小步数。
代码例如以下:
#include <iostream>
#include <cstring>
using namespace std;
int chess[7][7];//事实上利用的仅仅有中心的4x4
int x[5] = {0,0,1,0,-1};
int y[5] = {0,1,0,-1,0};
int flag, step;
int judge(int chess[7][7])//推断颜色是否所有同样
{
	for(int i = 1; i <= 4; i++)
	{
		for(int j = 1; j <= 4; j++)
		{
			if(chess[i][j] != chess[1][1])
				return 0;
		}
	}
	return 1;
}
void flip(int row, int col)//翻棋
{
	for(int i = 0; i <= 4; i++)
	{
		if(chess[row+x[i]][col+y[i]] == 1)
			chess[row+x[i]][col+y[i]] = 0;
		else
			chess[row+x[i]][col+y[i]] = 1;
	}
	return;
}
void dfs(int row,int col, int deep)//深搜固定步数看能否同色
{
	if(deep == step)
	{
		flag = judge(chess);
		return;
	}
	if(flag || row == 5)
		return;
	flip(row,col);
	if(col < 4)
		dfs(row,col+1,deep+1);
	else
		dfs(row+1,1,deep+1);
	flip(row,col);//不符合就翻回之前的状态
	if(col < 4)
		dfs(row,col+1,deep);
	else
		dfs(row+1,1,deep);
	return;
}
int main()
{
	char temp;
	int i, j;
	memset(chess,0,sizeof(chess));
	for(i = 1; i <= 4; i++)
	{
		for(j = 1; j <= 4; j++)
		{
			cin >>temp;
			if(temp == ‘b‘)
				chess[i][j] = 1;
		}
	}
	for(step = 0; step <= 16; step++)
	{//对每一步进行枚举(Enum)
		dfs(1,1,0);
		if(flag)
			break;
	}
	if(flag)
		cout<<step<<endl;
	else
		cout<<"Impossible"<<endl;
	return 0;
}原文:http://www.cnblogs.com/jzdwajue/p/6815646.html