涉及了位运算的一些点,左移、右移、和、或、异或的操作,理解的还不是很深刻
#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));
}