水管工游戏

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;
}
    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd3a7442b717778ac20a616
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞