NOI2.1.755 Flip Game 翻译+题解

NOI2.1.755 Flip Game 题解

文章目录

  • NOI2.1.755 Flip Game 题解
      • 题目
      • 思路
      • 代码

这一题是一道英文题。作者看完这一题后:
在这里插入图片描述

题目

题目的大概意思就是说:
一个4*4的方阵,每一个格子中的棋子要么是黑色的,要么是白色的,你每翻动一个棋子,那个棋子和上下左右都会被翻动,翻动的规则是黑变白,白变黑,问你最少要动几个棋子就可以让方阵中的所有棋子变成同种颜色(黑或白)。如果行,就输出翻几个,否则就输出“Impossible”。输入中以’w’为白色,以‘b’为黑色。每个字母中间不含空格。
输入样例:
bwwb
bbwb
bwwb
bwww
输出样例:
4

思路

这一道题的思路非常的简单,因为题目说大小固定是4*4,而且除黑白外绝对没有其他的。所以可以先用一个bool二维数组来储存黑白,然后使用暴力枚举每一种的情况(翻或不翻),所有的棋子选择过一遍后判断一下是否所有的棋子都为同一种颜色,如果是的话跟之前翻动的棋子最小值比较。最后输出就OK了。

代码

说完思路,代码也就轻而易举了。

#include
using namespace std;
bool a[5][5];
int ans = 2147483647;
void change(int x,int y){//把上下左右和本身都翻转。
	a[x][y] = !a[x][y];
	a[x+1][y] = !a[x+1][y];
	a[x-1][y] = !a[x-1][y];
	a[x][y+1] = !a[x][y+1];
	a[x][y-1] = !a[x][y-1];
	return ;
}
bool all(){//是否全都是一样的
	bool t = a[1][1];
	for(int i = 1;i<=4;i++){
		for(int j = 1;j<=4;j++){
			if(t!=a[i][j]){
				return false;
			}
		}
	}
	return true;
}
void f(int x,int y,int result){
	if(x == 4&&y == 5){
		if(all()){
			ans = min(result,ans);
		}
		return ;
	}else if(x!=4&&y == 5){
		y = 1;
		x++;
	}
	change(x,y);//翻动当前这个棋子
	f(x,y+1,result+1);
	change(x,y);//因为翻完后还要翻回去,才能变成原样
	f(x,y+1,result);
}
int main(){
	for(int i = 1;i<=4;i++){
		for(int j = 1;j<=4;j++){
			char k = getchar();
			if(k == 'w'){
				a[i][j] = true;
			}else{
				a[i][j] = false;
			}
		}
		getchar();
	}
	f(1,1,0);
	if(ans == 2147483647){//ans没有变动过,还是2147483647
		cout<<"Impossible";
	}else{
		cout<<ans;
	}
}

你可能感兴趣的:(题解,信息学)