POJ 1753 FlipGame

来源:互联网 发布:qt编程教程 编辑:程序博客网 时间:2024/06/17 13:29

这道题和之前做的熄灯问题很像,但还是花了很长时间,可能现在使用的算法还不是很好,等有时间再看看有什么其它好的解法。

犯的几个错误:

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;elsePuzzle[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;elsePuzzle[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;elsecout<<nStep<<endl;}


0 0