和上一道简单枚举dfs相似,区别是需要用结构体数组模拟栈,记录位置。出栈时要用flag判断,当找到答案时就不再出栈。wa好几次,读题不精,这道题需要所有开关都是打开状态,才可以开门,以及自己是用布尔变量保存图,然而在判断时忘记了,又wa好几发。通过这两道题可以加深对dfs搜索和递归函数的认识。
Accepted 164K 704MS C++ 1324B
#include<cstdio>
#include<stack>
using namespace std;
bool Map[5][5],flag;
int step;
struct ndoe
{
int x,y;
} a[20],t;
int top;
void turn(int i,int j)
{
for(int k=0; k<4; k++)
{
Map[i][k]=!Map[i][k];
Map[k][j]=!Map[k][j];
}
Map[i][j]=!Map[i][j];
}
bool ju()
{
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if(Map[i][j]==true)
return false;
return true;
}
void dfs(int i,int j,int p)
{
if(p==step)
{
flag=ju();
return;
}
if(i==4||flag)
return;
turn(i,j);
t.x=i;
t.y=j;
a[top++]=t;
if(j<3)
dfs(i,j+1,p+1);
else
dfs(i+1,0,p+1);
turn(i,j);
if(!flag)top--;
if(j<3)
dfs(i,j+1,p);
else
dfs(i+1,0,p);
}
int main()
{
char t;
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
scanf("%c",&t);
if(t=='-')
Map[i][j]=false;
else
Map[i][j]=true;
}
getchar();
}
flag=false;
top=0;
for(step=0; step<=16; step++)
{
dfs(0,0,0);
if(flag)break;
}
if(flag)printf("%d\n",step);
for(int i=0; i<top; i++)
{
printf("%d %d",a[i].x+1,a[i].y+1);
if(i!=top-1)printf("\n");
}
}