BFS特训:Abbott的复仇(UVA816)尚未完善版本

该博客介绍了如何运用BFS(广度优先搜索)算法解决UVA816题目的最短路径问题。作者通过定义结构体记录前驱节点,并采用递归打印结果的方式,虽然代码量较大,但能找出最短路径。作者提到后续会研究更简洁的方法,如刘汝佳老师的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:运用BFS求解最短路径,定义结构体记录前一个节点,最后递归打印结果。使用方法比较复杂,代码量很大,实际可以不用这么麻烦,后面有时间会认真参考刘汝佳老师的方法!

大体题意:

有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出。

#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<sstream>
#include<string.h>
using namespace std;

struct p
{
	int prex,prey;
	int x,y;
	string s;
}maze[10][10];

bool mark[10][10];     //因为是BFS,每个点应该只走一次,用该数组记录某个点是否走过。 

bool ans=false;

int sx,sy,ex,ey;

queue<p> Q;

int go[4][2]=
{
	1,0,
	-1,0,
	0,1,
	0,-1
};

void BFS()
{
	while(Q.empty()==false)
	{
		p tmp=Q.front();
		Q.pop();
		stringstream ss(tmp.s);
		string str;
		while(ss>>str)
		{
			if(str[0]=='*') break;
			for(int i=1;i<str.length();i++)
			{
				if(str[0]=='N')
				{
					if(str[i]=='L')
					{
						int nx=tmp.x+go[3][0];
						int ny=tmp.y+go[3][1];         
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='R')
					{
						int nx=tmp.x+go[2][0];
						int ny=tmp.y+go[2][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='F')
					{
						int nx=tmp.x+go[1][0];
						int ny=tmp.y+go[1][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
				}
				else if(str[0]=='S')
				{
					if(str[i]=='L')
					{
						int nx=tmp.x+go[2][0];
						int ny=tmp.y+go[2][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='R')
					{
						int nx=tmp.x+go[3][0];
						int ny=tmp.y+go[3][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='F')
					{
						int nx=tmp.x+go[0][0];
						int ny=tmp.y+go[0][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
				}
				else if(str[0]=='E')
				{
					if(str[i]=='L')
					{
						int nx=tmp.x+go[1][0];
						int ny=tmp.y+go[1][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='R')
					{
						int nx=tmp.x+go[0][0];
						int ny=tmp.y+go[0][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='F')
					{
						int nx=tmp.x+go[2][0];
						int ny=tmp.y+go[2][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
				}
				else if(str[0]=='W')
				{
					if(str[i]=='L')
					{
						int nx=tmp.x+go[0][0];
						int ny=tmp.y+go[0][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='R')
					{
						int nx=tmp.x+go[1][0];
						int ny=tmp.y+go[1][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
					else if(str[i]=='F')
					{
						int nx=tmp.x+go[3][0];
						int ny=tmp.y+go[3][1];
						if(nx<1||nx>9||ny<1||ny>9) continue;
						if(mark[nx][ny]==true) continue;
						mark[nx][ny]=true;
						maze[nx][ny].prex=tmp.x;
						maze[nx][ny].prey=tmp.y;
						if(nx==ex&&ny==ey)
						{
							ans=true;
							return;
						}
						Q.push(maze[nx][ny]);
					}
				}
			}
		}
	}
}

void print(int x,int y)         //递归打印结果 
{
	//cout<<"("<<x<<","<<y<<")"<<" ";
	if(maze[x][y].prex!=0||maze[x][y].prey!=0)
	print(maze[x][y].prex,maze[x][y].prey);
	cout<<"("<<x<<","<<y<<")"<<" ";
	return;
}

int main()
{
	string name;
	while(cin>>name)
	{
		if(name=="END") break;
		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
			{
				maze[i][j].x=i;
				maze[i][j].y=j;
				maze[i][j].prex=maze[i][j].prey=0;
			}
		}

		char dir;
		cin>>sx>>sy>>dir>>ex>>ey;
		if(dir=='N')
		{
			maze[sx-1][sy].prex=sx;
			maze[sx-1][sy].prey=sy;
			sx-=1;
		}
		else if(dir=='S')
		{
			maze[sx+1][sy].prex=sx;
			maze[sx+1][sy].prey=sy;
			sx+=1;
		}
		else if(dir=='W')
		{
			maze[sx][sy-1].prex=sx;
			maze[sx][sy-1].prey=sy;
			sy-=1;
		}
		else if(dir=='E')
		{
			maze[sx][sy+1].prex=sx;
			maze[sx][sy+1].prey=sy;
			sy+=1;
		}
		int x,y;
		while(cin>>x)
		{
			if(x==0)
			break;
			cin>>y;
			getline(cin,maze[x][y].s);
			//cout<<x<<' '<<y<<' '<<maze[x][y].s<<endl;
		}
		while(Q.empty()==false) Q.pop();
		Q.push(maze[sx][sy]);
		memset(mark,false,sizeof(mark));
		mark[sx][sy]=true;    //这一句一定要加 
		BFS();
		//cout<<ans<<endl;
		if(ans==true) 
		print(ex,ey);
		else
		cout<<"fail"<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值