Untitled

 avatar
unknown
plain_text
2 years ago
1.9 kB
4
Indexable
#include<iostream>
using namespace std;

int map[4][4];
int mapCopy[4][4];
int arrSinh[65536][16];


int dx[4] = {1,-1, 0, 0};
int dy[4] = {0, 0,-1, 1};

void turnOver(int x, int y){
	mapCopy[x][y] = 1 - mapCopy[x][y];
	for (int i = 0; i < 4; i++){
		int x1 = x + dx[i];
		int y1 = y + dy[i];
		if (x1>=0 && x1<4 && y1>=0 && y1 <4){
			mapCopy[x1][y1] = 1 - mapCopy[x1][y1];
		}
	}
}

bool checkFull(){
	for (int i = 0; i < 4; i++){
		for(int j=0; j < 4; j++){
			if (mapCopy[i][j] != mapCopy[0][0]) return false;
		}
	}
	return true;
}

int hang = 0;
void sinh(int k){
	if (k == 16){
		hang++;
		return;
	}

	arrSinh[hang][k] = 0; sinh(k+1);
	arrSinh[hang][k] = 1; sinh(k+1);
}

void resetMap(){
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			mapCopy[i][j] = map[i][j];
		}
	}
}

int main(){
//	freopen("input.txt","r",stdin);
	int TC; cin >> TC;
	int ans;
	for (int tc = 1; tc <= TC; tc++){
		// input
		for (int i = 0; i < 4; i++){
			for (int j = 0; j < 4; j++){
				char x; cin >> x;
				if (x == 'b') map[i][j] = 1;
				else if (x == 'w') map[i][j] = 0;
			}
		}
		// reset SINH
		ans = 1000000;
		for (int i = 0; i < 65536; i++){
			for (int j = 0; j < 16; j++){
				arrSinh[i][j] = 0;
			}
		}
		sinh(0);

		// program		
		for (int i = 0; i < 65536; i++){
			resetMap();
			int sum = 0;
			// lat theo tung truong hop i
			for (int j = 0; j < 16; j++){
				if(arrSinh[i][j] == 1){
					// lat 
					sum++;
					if (j<=3) turnOver(0,j);
					else if (j<=7) turnOver(1,j-4);
					else if (j<=11) turnOver(2,j-8);
					else turnOver(3,j-12);
				}
			}
			
			if (checkFull() && ans > sum && sum > 0) ans = sum;
		}

		cout << "Case #" << tc << endl;
		if (ans < 1000000) cout << ans << endl;
		else cout << "impossible" << endl;

	}
	return 0;
}
Editor is loading...