如下图:一个5*4的土地中(2,4)处有一个树木。
我们可以旋转其中的一些管道,使之构成一个连通的管道系统,如下图。
0表示树木,1-6分别表示管道的六种摆放方式
1
2
3
4
5
6
#include<iostream>
using namespace std;
int a[51][51],book[51][51];
int n,m,top;
int flag=0;
struct node{
int x;
int y;
};
node s[100];
void dfs(int x,int y,int front)
{
//y==m+1是因为水管要通过才可以
if(x==n&&y==m+1)
{
flag=1; //找到道路
for(int i=1;i<=top;i++)
{
cout<<"("<<s[i].x<<","<<s[i].y<<")";
}
return;
}
//判断是否越界
if(x<1||y<1||x>n||y>n)
{
return;
}
//标记是否已经访问过
if(book[x][y]==1)
return;
book[x][y]=1;
//将当前坐标入栈
//注意top值的变化
top++;
s[top].x=x;
s[top].y=y;
//按照 左 上 右 下的顺序给进水口编号为1 2 3 4;
//注意每个编号所对应的的出水口及引起的x y的变化
//判断直管
if(a[x][y]>=5&&a[x][y]<=6)
{
if(front==1)
{
dfs(x,y+1,1);
}
if(front==2)
{
dfs(x+1,y,2);
}
if(front==3)
{
dfs(x,y-1,3);
}
if(front==4)
{
dfs(x-1,y,4);
}
}
//判断弯管
if(a[x][y]>=1&&a[x][y]<=4)
{
if(front==2)
{
dfs(x,y-1,3);
dfs(x,y+1,1);
}
if(front==1)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==3)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==4)
{
dfs(x,y-1,3);
dfs(x,y+1,1);
}
}
book[x][y]=0;
top--; // 将当前坐标出栈
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
dfs(1,1,1);
if(flag==0)
cout<<"impossible";
return 0;
}