这道题和之前做的熄灯问题很像,但还是花了很长时间,可能现在使用的算法还不是很好,等有时间再看看有什么其它好的解法。
犯的几个错误:
1、在做枚举的时候,终止条件设成了Press[1][4] ==1
2、第二次枚举之前,没有将Press数组重置
3、输入数据的时候 用%c一个一个输入,这样的话会将回车也算到数组当中去,导致赋值不正确
真的需要多练习啊
#include <iostream>
#include <stdio.h>
using namespace std;
const int Row = 5;
const int Col = 6;
int MinStep = 1000;
int Puzzle[Row][Col] = {0};
int Press [Row][Col] = {0};
char status[4][4];
int Guess()
{
//根据初始状态得出Press数组
for(int i = 2; i < Row ;i++)
{
for(int j = 1 ;j < Col - 1; j++)
{
Press[i][j] = (Puzzle[i-1][j] + Press[i-2][j] + Press[i-1][j-1] + Press[i-1][j] + Press[i-1][j+1]) % 2 ;
}
}
//根据Press数组得出最后一行的状态
for(int i =1; i< Col -1; i++)
{
if(Puzzle[4][i] != (Press[3][i] + Press [4][i-1] + Press[4][i]+ Press[4][i+1])%2 )
return -1;
}
int step = 0;
for(int i = 1;i <= 4; i++)
{
for(int j =1; j<=4 ;j++)
{
if(Press[i][j] == 1)
step ++ ;
}
}
return step;
}
void Enumerator()
{
int result = Guess();
if(result >= 0 && result < MinStep)
MinStep = result;
while(1)
{
int j = 1;
Press[1][j]++;
while(Press[1][j] == 2)
{
Press[1][j+1]++;
Press[1][j] = 0;
j = j+1;
}
result = Guess();
if(result >= 0 && result < MinStep)
MinStep = result;
if(Press[1][5]==1)
break;
}
}
int main()
{
char c;
for(int i =0 ;i <4;i++)
{
scanf("%s",&status[i]);
}
for(int i=0 ;i<4;i++)
{
for(int j=0; j<4;j++)
{
if(status[i][j] == 'b')
Puzzle[i+1][j+1] = 1;
else
Puzzle[i+1][j+1] = 0;
}
}
Enumerator();
int nStep1 = MinStep;
MinStep = 1000;
for(int i=0 ;i<4;i++)
{
for(int j=0; j<4;j++)
{
if(status[i][j] == 'w')
Puzzle[i+1][j+1] = 1;
else
Puzzle[i+1][j+1] = 0;
}
}
for(int i =0 ;i<Row;i++)
{
for(int j =0 ; j<Col;j++)
Press[i][j] = 0;
}
Enumerator();
int nStep2 = MinStep;
int nStep = (nStep1 > nStep2) ? nStep2:nStep1;
if(nStep == 1000)
cout<<"Impossible"<<endl;
else
cout<<nStep<<endl;
}