题目:1753
题意:有一个4*4的棋盘,棋盘上有黑白格,每一次你可以翻其中的一个格子。一个格子(x,y)如果被翻,它相邻的前后左右四个格子(如果在棋盘上)也要翻转。现在给你一个初始的棋盘状态,问把这个棋盘翻转到全黑或全白的最少次数;若不能达到全黑或全白,输出Impossible。
题解:对于每一个格子,翻奇数任意次和翻一次没有区别,翻偶数任意次和翻0次没有区别,所有直接递归枚举所有的状态即可
AC代码:
#include<iostream>
using namespace std;
#define border 100
int c[16] = {0}; //存储状态矩阵
int ans = border; //步数
void change(int i) {
int x = i / 4;
int y = i % 4;
c[i] = !c[i];
if (x > 0)
c[i - 4] = !c[i - 4];
if (x < 3)
c[i + 4] = !c[i + 4];
if (y > 0)
c[i - 1] = !c[i - 1];
if (y < 3)
c[i + 1] = !c[i + 1];
}
bool check() { //测试是否全白或者全黑
for (int i = 0; i < 15; i++)
if (c[i] != c[i + 1])
return false;
return true;
}
void dfs(int num, int cnt) {