算法:
枚举第一行所有情况
说是水平
写了200行。。
wrong answer 了4次。。
犯了低级错误!!
#include <iostream>
#include <bitset>
using namespace std;
char gameborad[4][4] ;
int flag;
#define INFINITE 0xFFFFFFF
//满足要求与否
bool IsSatistied(char gameborad[4][4])
{
for (int i = 0 ; i < 4 ; i++)
{
for (int j = 0 ; j < 4 ; j++)
{
if(gameborad[i][j] != gameborad[0][0])
return false;
}
}
return true ;
}
//改变结点状态
void change(char gameborad[4][4],int i,int j)
{
if (gameborad[i][j] == 'w')
{
gameborad[i][j] = 'b' ;
}
else
gameborad[i][j] = 'w' ;
}
//切换某一点的开关状态引起的变化
void turn(char gameborad[4][4] ,int i,int j)
{
change(gameborad,i,j) ;
if (i > 0)
{
change(gameborad,i-1,j) ;
}
if (j > 0)
{
change(gameborad,i,j-1) ;
}
if (i < 3)
{
change(gameborad,i+1,j) ;
}
if (j < 3)
{
change(gameborad,i,j+1) ;
}
}
//测试
int test(char gameborad[4][4])
{
//保存原始矩阵值
char originboard[4][4] ;
for (int ii = 0 ; ii < 4 ; ++ii)
{
for (int jj = 0 ; jj < 4 ; ++jj)
{
originboard[ii][jj] = gameborad[ii][jj] ;
}
}
//保存最后的步数结论,一共枚举2^4=16 次,分黑白
int stepsw[16] ;
int stepsb[16] ;
int minsteps = INFINITE ;
for (int m = 0 ; m <16 ;m++)
{
stepsb[m] = INFINITE ;
stepsw[m] = INFINITE ;
}
//每次翻转哪些 0000-0001-...-1111
bitset<4> vecs[16] ;
bitset<4> vectemp ;
for (int bib = 0 ; bib < 16 ; bib ++)
{
vecs[bib] = bib ;
}
//开始16次枚举
for (int i = 0 ; i < 16 ; ++i)
{
int steptow = 0;
int steptob = 0;
vectemp = vecs[i] ;
//回复原始棋盘
for (int ii = 0 ; ii < 4 ; ++ii)
{
for (int jj = 0 ; jj < 4 ; ++jj)
{
gameborad[ii][jj] = originboard[ii][jj] ;
}
}
//按照白色朝上
//第一行
for (int j = 0 ; j < 4 ; j++)
{
if (vectemp[j] == 1)
{
turn(gameborad,0,j) ;
steptow++;
}
}
//
for (int k = 1 ;k < 4 ; k ++)
{
for (int j = 0 ; j < 4 ; j++)
{
if (gameborad[k-1][j] == 'b')
{
turn(gameborad,k,j) ;
steptow ++ ;
}
}
}
if (IsSatistied(gameborad))
stepsw[i] = steptow ;
//回复原始棋盘
for (int iii = 0 ; iii < 4 ; ++iii)
{
for (int jj = 0 ; jj < 4 ; ++jj)
{
gameborad[iii][jj] = originboard[iii][jj] ;
}
}
//第一行
//按照黑色朝上
for (int bj1 = 0 ; bj1 < 4 ; bj1++)
{
if (vectemp[bj1] == 1)
{
turn(gameborad,0,bj1) ;
steptob++;
}
}
for (int kk = 1 ;kk < 4 ; kk ++)
{
for (int j = 0 ; j < 4 ; j++)
{
if (gameborad[kk-1][j] == 'w')
{
turn(gameborad,kk,j) ;
steptob ++ ;
}
}
}
if (IsSatistied(gameborad))
stepsb[i] = steptob ;
}
for (int num = 0 ; num < 16 ; num++)
{
if (stepsw[num] < minsteps)
{
minsteps = stepsw[num] ;
}
if (stepsb[num] < minsteps)
{
minsteps = stepsb[num] ;
}
}
return minsteps ;
}
int main()
{
//读入初始状态
for (int i = 0 ; i < 4 ; i++)
{
for (int j = 0 ; j < 4 ; j++)
{
cin >> gameborad[i][j] ;
}
}
if (IsSatistied(gameborad))
{
cout << 0;
return 0 ;
}
/*
cout << endl ;
turn(gameborad,2,2) ;
for ( i = 0 ; i < 4 ; i++)
{
for (int j = 0 ; j < 4 ; j++)
{
cout << gameborad[i][j] ;
}
cout << endl ;
}
return 0 ;
*/
int steps = test(gameborad) ;
if (steps != INFINITE)
{
cout << steps ;
}
else
cout << "Impossible";
return 0 ;
}