暴力就vans了
176K | 125MS |
#include <iostream>
#include <vector>
#include<string>
#include<stdio.h>
using namespace std;
int pos[4][4];
int dirr[5] = { -1,1,0,0,0 };
int dirc[5] = { 0,0,1,-1,0 };
int Min = INT_MAX, cnt = 0;
int c[16];
void flip(int cur)
{
int row = cur / 4;
int col = cur % 4;
for (int i = 0; i < 5; i++)
{
if (row + dirr[i] >= 0 && row + dirr[i] < 4 && col + dirc[i] >= 0 && col + dirc[i] < 4)
{
pos[row + dirr[i]][col + dirc[i]] = pos[row + dirr[i]][col + dirc[i]] == 0 ? 1 : 0;
}
}
}
int all_same()
{
for (int i = 1; i < 16; i++)
{
int row = i / 4;
int col = i % 4;
if (pos[row][col] != pos[0][0])
{
return 0;
}
}
return 1;
}
void dfs(int cur)
{
if (cnt >= Min)
return;
if (all_same())
{
if (Min > cnt)
Min = cnt;
return;
}
if (cur == 16)
return;
flip(cur);
cnt++;
dfs(cur + 1);
flip(cur);
cnt--;
dfs(cur + 1);
return;
}
int main()
{
char temp[5];
for (int i = 0; i < 4; i++)
{
gets_s(temp);
for (int j = 0; j < 4; j++)
{
pos[i][j] = temp[j] == 'b' ? 0 : 1;
}
}
dfs(0);
if (Min == INT_MAX)
cout << "Impossible" << endl;
else
cout << Min << endl;
return 0;
}