用的是二进制枚举,感觉自己写的有点麻烦,大家稍微借鉴一下就好了。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int map[10][10];
char c[10][10];
int cur[10][10];
int cur1[10][10];
int cur2[10][10];
int sum = 0;
int min1 = 999999;
int num = (1 << 4);
void deal()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (c[i][j] == 'b')
map[i + 1][j + 1] = 1;
else if (c[i][j] == 'w')
map[i + 1][j + 1] = 0;
}
}
}
void Flip(int i, int j, int (*a)[10])//翻转棋子。
{
if (a[i][j] == 0)
a[i][j] = 1;
else if (a[i][j] == 1)
a[i][j] = 0;
}
int getbit(int i, int n)
{
return (n >> i) & 1;
}
int solve1() //枚举剩下的行,但全部翻转为1
{
int ss = 0;
for (int i = 2; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (cur1[i - 1][j] == 0)
{
ss++;
Flip(i, j, cur1);
Flip(i - 1, j, cur1);
if (j > 1)
Flip(i, j - 1, cur1);
if (j < 4)
Flip(i, j + 1, cur1);
if (i < 4)
Flip(i + 1, j, cur1);
}
}
}
int u = cur1[4][1] + cur1[4][2] + cur1[4][3] + cur1[4][4];
if (u == 4)
return ss;
return 0;
}
int solve2()//枚举剩下的行全部翻转为0
{
int ss = 0;
for (int i = 2; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (cur2[i - 1][j] == 1)
{
ss++;
Flip(i, j, cur2);
Flip(i - 1, j, cur2);
if (j > 1)
Flip(i, j - 1, cur2);
if (j < 4)
Flip(i, j + 1, cur2);
if (i < 4)
Flip(i + 1, j, cur2);
}
}
}
int u = cur2[4][1] + cur2[4][2] + cur2[4][3] + cur2[4][4];
// cout << u << ends;
if (u == 0)
return ss;
return 0;
}
int main()
{
for (int i = 0; i < 4; i++)
{
cin >> c[i];
}
deal();
int sss = 0;
for (int i = 1; i <= 4;i++){
for (int j = 1; j <= 4;j++){
sss += map[i][j];
}
}
if(sss==0||sss==16){ //如果给的输入直接全部同色,则结束。
cout << 0 << endl;
return 0;}
for (int i = 0; i < num; i++)//枚举第一行
{
memcpy(cur, map, sizeof(map));
sum = 0;
int switchs = i;
for (int j = 1; j <= 4; j++)
{
int _on = getbit(j - 1, switchs);
if (_on)
{
sum++;
Flip(1, j, cur);
Flip(2, j, cur);
if (j > 1)
Flip(1, j - 1, cur);
if (j < 4)
Flip(1, j + 1, cur);
}
}
memcpy(cur1, cur, sizeof(cur));
memcpy(cur2, cur, sizeof(cur));
int u = solve1();
if (u != 0)
{
if (u + sum < min1)
min1 = u + sum;
}
int u2 = solve2();
if (u2 != 0)
{
if (u2 + sum < min1)
min1 = u2 + sum;
}
}
if(min1!=999999)
cout << min1 << endl;
else
cout << "Impossible" << endl;
}