Flip 枚举
题目链接
大概题意:
给你一个4x4的棋盘,每个棋子都有黑白两面,问最少翻多少个棋子能让棋盘上全部是黑或者全部是白
思路: 深搜枚举
从第一个点开始开始,我每个棋子都选择翻转或者不翻转,把所有结果都尝试一遍
代码:
#include <iostream>
#include <cmath>
char mp[4][4];
int skip = 0x3f3f3f3f;
void Flip(int x, int y)
{
mp[x][y] = mp[x][y] == 'b'? 'w': 'b';
if(x-1 >= 0) mp[x-1][y] = mp[x-1][y] == 'b'? 'w': 'b';
if(x+1 < 4) mp[x+1][y] = mp[x+1][y] == 'b'? 'w': 'b';
if(y-1 >= 0) mp[x][y-1] = mp[x][y-1] == 'b'? 'w': 'b';
if(y+1 < 4) mp[x][y+1] = mp[x][y+1] == 'b'? 'w': 'b';
}
bool judge()
{
char temp = mp[0][0];
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 4; ++j)
{
if(temp != mp[i][j]) return false;
}
}
return true;
}
void dfs(int x, int y, int n)
{
if(judge())
{
skip = std::min(skip, n);
}
if(x > 3 || y > 3) return;
int xx = x + (y+1) / 4;
int yy = (y+1) % 4;
dfs(xx, yy, n);
Flip(x, y);
dfs(xx, yy , n+1);
Flip(x, y);
return;
}
int main()
{
for(int i = 0; i < 4; ++i)
std::cin >> mp[i];
dfs(0, 0, 0);
if(skip == 0x3f3f3f3f) std::cout << "Impossible" << std::endl;
else std::cout << skip << std::endl;
return 0;
}