题目链接:http://poj.org/problem?id=2965
大致题意:这题和POJ1753 Flip GAME差不多,就是在这里反转时是一整行一整列都要变化,而不像1753题只是相邻的上下左右要变化,具体见https://blog.youkuaiyun.com/Fitz1318/article/details/86146329
解题思路:具体见https://blog.youkuaiyun.com/Fitz1318/article/details/86146329
AC代码:
#include <iostream>
using namespace std;
bool a[5][5] = {0};
int ri[16],cj[16];
bool flag;
int deep;
int step;
int judge()
{
for(int i=1; i<5; i++){
for(int j=1; j<5; j++){
if(a[i][j] != 1)
return 0;
}
}
return 1;
}
void flip(int x,int y)
{
for(int i=1; i<5; i++){
a[x][i] = !a[x][i];
}
for(int j=1; j<5; j++){
a[j][y] = !a[j][y];
}
a[x][y] =!a[x][y];
}
void dfs(int x,int y,int deep)
{
if(deep == step){
flag = judge();
return;
}
if(flag||x==5)
return;
//翻棋
flip(x,y);
ri[deep] = x;
cj[deep] = y;
if(y<4)
dfs(x,y+1,deep+1);
else
dfs(x+1,1,deep+1);
//不符合则翻转回来
flip(x,y);
if(y<4)
dfs(x,y+1,deep);
else
dfs(x+1,1,deep);
return;
}
int main()
{
char temp;
int i,j;
for(i=1; i<5; i++){
for(j=1; j<5;j++){
cin >> temp;
if(temp == '-')
a[i][j] = 1;
}
}
for(step=0; step<=16; step++){
dfs(1,1,0);
if(flag)
break;
}
cout << step << endl;
for(int i=0; i<step; i++){
cout << ri[i] <<' '<<cj[i]<< endl;
}
return 0;
}