1、题目
水管工游戏是指如下图中的矩阵中,一共有两种管道,一个是直的,一个是弯的,所有管道都可以自由旋转,最终就是要连通入水口可出水口。其中的树为障碍物。
2、算法思路
本题使用的是深度优先搜索算法,先标识入水口方向,在每次探索新管道的时候上根据入水口方向进行扩展,然后根据管道的类型来判断下一个节点的入水口方向。
代码实现:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,flag,book[51][51];
struct note{
int x,y;
}s[100];
int top=0;
void dfs(int x,int y,int front)
{
int i;
if(x==n&&y==m+1)
{
flag=1;
for(int i=1;i<=top;i++)
{
printf("%d,%d\n",s[i].x,s[i].y);
}
return;
}
if(x<1||x>n||y>m||y<1)
{
return ;
}
if(book[x][y]==1)
return ;
book[x][y]=1;
top++;
s[top].x=x;
s[top].y=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);
}
}else if(a[x][y]>=1&&a[x][y]<=4){
if(front==1)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==2)
{
dfs(x,y+1,1);
dfs(x,y-1,3);
}
if(front==4)
{
dfs(x,y+1,1);
dfs(x,y-1,3);
}
if(front==3)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
}
book[x][y]=0;
top--;
return ;
}
int main(){
int num=0;
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<<"没有";
return 0;
}