小技巧:从地图的某点传送到某点

本文详细介绍了使用广度优先搜索(BFS)解决带有传送门的迷宫问题。代码中展示了如何建立迷宫,处理传送门,并通过BFS找到从起点到终点的最短路径。关键在于利用队列进行搜索并避免死循环,同时用二维数组记录已访问状态。
摘要由CSDN通过智能技术生成

在这里插入图片描述代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char e[N][N];
int vx[N][N],vy[N][N],book[N][N];
int to[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,st,et;
struct Node{
	int x,y,s;
};
int bfs(int x,int y)
{
	int gx,gy,flag,tx,ty,i;
	queue<Node> Q;
	struct Node u,v;
	memset(book,0,sizeof(book));
	v.x=x;
	v.y=y;
	v.s=0;
	book[x][y]=1;
	Q.push(v);
	while(!Q.empty())
	{
		u=Q.front();
		Q.pop();
		if(u.x==st&&u.y==et)	return u.s;
		tx=vx[u.x][u.y];
		ty=vy[u.x][u.y];
		if(tx!=0&&ty!=0)
		{
			if(tx<1||tx>n||ty<1||ty>m)	continue;
			if(book[tx][ty])	continue;
			if(e[tx][ty]=='*')	continue;
			book[tx][ty]=1;
			v.x=tx;
			v.y=ty;
			v.s=u.s;
			Q.push(v);
		}
		else
		{
			for(i=0;i<4;i++)
			{
				tx=u.x+to[i][0];
				ty=u.y+to[i][1];
				if(tx<1||tx>n||ty<1||ty>m)	continue;
				if(book[tx][ty])	continue;
				if(e[tx][ty]=='*')	continue;
				book[tx][ty]=1;
				v.x=tx;
				v.y=ty;
				v.s=u.s+1;
				Q.push(v);	
			}
		}
	}
	return -1;	
}
int main()
{
	int i,q,a,b,c,d,t;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%s",e[i]+1);
	scanf("%d",&q);
	memset(vx,0,sizeof(vx));
	memset(vy,0,sizeof(vy));
	while(q--)
	{
		scanf("%d %d %d %d",&a,&b,&c,&d);
		vx[a][b]=c;
		vy[a][b]=d;
	}
	scanf("%d %d",&st,&et);
	t=bfs(1,1);
	if(e[1][1]=='*')	t=-1;
	if(t>=0)
		printf("%d\n",t);
	else
		printf("No solution\n");
	return 0;
}
/*
传送点不可以自己传自己,死循环
传送点不可以传到某点后再传到自己,死循环
这些用book标记即可,每个点最多传送一次 
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值