涉及了位运算的一些点,左移、右移、和、或、异或的操作,理解的还不是很深刻
#include<iostream>
#include<algorithm>
using namespace std;
int a[10],b[10];
int change[20];
int calc(int x)
{
int cnt = 0;
for (int i = 0; i < 4; i++)
{
if ((x >> i )& 1) cnt++;
}
return cnt;
}
int solve(int a[])
{
int res = 20;
int cur[10];
int ans = 0;
for (change[0] = 0; change[0] <= (1<<4)-1; change[0]++)
{
ans = calc(change[0]);
cur[0] = a[0] ^ change[0] ^ (change[0] >> 1) ^ ((change[0] << 1) &((1<<4)-1));
cur[1] = a[1] ^ change[0];
for (int i = 1; i < 4; i++)
{
change[i] = cur[i - 1];
ans += calc(change[i]);
cur[i] = cur[i] ^ change[i] ^ (change[i] >> 1) ^ ((change[i] << 1) & ((1 << 4) - 1));
cur[i + 1] = a[i + 1] ^ change[i];
}
if (cur[3] == 0)
{
res = min(ans, res);
}
}
return res;
}
int main()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
char x;
scanf(" %c", &x);
if (x == 'b') a[i] += (1 << j);
else b[i] += (1 << j);
}
}
int cnt1=solve(a);
int cnt2=solve(b);
if (cnt1 == 20 && cnt2 == 20) printf("Impossible");
else printf("%d", min(cnt1, cnt2));
}