和poj1753很像 只是翻转的方式改变了~还是用DFS暴力枚举。值得注意的就是记录路径了。‘可以用rr和cc数组来代表路径的横纵坐标。
rr[deep] cc[deep]表示的是第deep步的坐标。这样记录省空间并且容易。一开始用双向队列记录的时候会把错误的步数也记录上去。用数组就好很多
#include<stdio.h>
#include<string.h>
#include <iostream>
#include<queue>
using namespace std;
int rr[16];
int cc[16];
bool chess[6][6]={false};
int step;
bool flag;
bool judge_all(void)
{
for(int i=1; i<5; i++)
{
for(int j=1; j<5; j++)
{
if(chess[i][j]!=1)
{
return false;
}
}
}
return true;
}
void filp(int row,int col)
{
for(int i=1; i<5; i++)
{
if(i!=col)
chess[row][i]=!chess[row][i];
if(i!=row)
chess[i][col]=!chess[i][col];
}
chess[row][col]=!chess[row][col];
return;
}
void dfs(int row,int col,int deep)
{
if(deep==step)
{
flag=judge_all();
return;
}
if(flag||row==5)
{
return;
}
filp(row,col);
rr[deep]=row;
cc[deep]=col;
if(col<4)
dfs(row,col+1,deep+1);
else
dfs(row+1,1,deep+1);
filp(row,col);
if(col<4)
dfs(row,col+1,deep);
else
dfs(row+1,1,deep);
return;
}
int main()
{
char temp;
for(int i=1; i<5; i++)
{
for(int j=1; j<5; j++)
{
cin>>temp;
if(temp=='-')
chess[i][j]=true;
}
}
for(step=0; step<=16; step++)
{
dfs(1,1,0);
if(flag)
{
break;
}
}
printf("%d\n",step);
for(int i=0;i<step;i++)
printf("%d %d\n",rr[i],cc[i]);
}