宽度优先搜索第n遍

宽度优先搜索第n遍

最近有种少年痴呆的感觉,停好几次车然后每次走的时候,发现自行车不见了,后来在同伴惊愕与无语的表情中想起,原来是停到别的地方去了,但是还好,这几次欠的饭钱准时还了,哈哈,今天把这道入门bfs小题研究的透透的,以后再忘,估计凑几眼,也能想起来。

***迷宫的最短路径
给定一个大小为N
M的迷宫。迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。如果不能到达,输出“不能走到那里”。(N,M<=50,起点,终点分别用S,G表示)
输入样例:N=5,M=5
#S###
…##.
#.###
…###
…G##

输出:5****

//简单BFS,//最短路问题 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char maze[50][50];
bool vis[10][10];
int n,m;
int sx,sy;
int ex,ey;
int dir[4][2]={0,1,1,0,-1,0,0,-1} ;
struct node
{
    int x,y,step;
};
void bfs()
{
    node p;//第一个结构体 
    p.x=sx;
	p.y=sy;//起点坐标 
	p.step=0;
    queue<node>q;
    q.push(p);//进队列 
    vis[sx][sy]=1;//标记 
    while(!q.empty())//判断是否为空 
    {//第二个结构体 
	   node tmp=q.front();//新结构体讲队列第一个元素赋值 
        q.pop();//出队列 
        if(tmp.x==ex&&tmp.y==ey)//如果第一个出队列的元素坐标与终点坐标相等的话。 
            {cout<<"最短路为"<<tmp.step<<endl;
                return;
				}
        for(int i=0;i<4;i++)
        {int xx=tmp.x+dir[i][0];
        int yy=tmp.y+dir[i][1];
        if(maze[xx][yy]!='#'&&xx>0&&yy>0&&xx<=n&&yy<=m&&!vis[xx][yy])//和dfs一样判断条件 
        {
            node tp;//第三个结构体 
            tp.x=xx;//存储移动后的坐标 
            tp.y=yy;
            tp.step=tmp.step+1;//计步 
            vis[xx][yy]=1;//标记 
            q.push(tp);//入队列 
        }

        }
    }
    cout << "不能走到那里!" << endl;
}


int main()
{
    while(~scanf("%d%d",&n,&m)&&n!=0&&m!=0)
    {   memset(vis,0,sizeof(vis));//给标记数组清零
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {cin>>maze[i][j]; 
          if(maze[i][j]=='S')
                {sx=i;//起点坐标 
				sy=j;
				}//更新一波 
            if(maze[i][j]=='G')
            {ex=i;//终点坐标 
			ey=j;}
    		}	
		   bfs();
    	}
}

昨天下午又大了一遍输出怎么搞都是0;今天早上醒来,神清气爽,一下子就发现了一个逻辑错误

				node top;//这个结构题不能定义在判断语句里面,否则会出现错误
 				top.x=xx;
				top.y=yy;
				top.ans=tp.ans+1;
				vis[top.x][top.y]=1;
				q.push(top);

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<time.h>
#include<queue>
#include<stack>
using namespace std;
int n,m;
int dir[4][2]={0,1,1,0,-1,0,0,-1};
char map[10][10];
int vis[10][10];
int sx,sy,ex,ey;
struct node{
	int x;
	int y;
	int ans;
};
	node top;
void bfs()
{
	//稳住第一个结构体
	node p;
	p.x=sx;
	p.y=sy;
	p.ans=0;
	queue<node> q;
	q.push(p);
	vis[p.x][p.y]=1;
	while(!q.empty())
	{
		//第二个结构体 
		node tp=q.front();
		q.pop();
		if(tp.x==ex&&tp.y==ey)
		{
			cout<<"输出"<<top.ans<<endl;
			return ;
		}
		for(int i=0;i<4;i++)
		{
			
		 
			int xx=tp.x+dir[i][0];
			int yy=tp.y+dir[i][1];
			if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='#'&&!vis[xx][yy])
			{
				node top;//删去这句即可
 				top.x=xx;
				top.y=yy;
				top.ans=tp.ans+1;
				vis[top.x][top.y]=1;
				q.push(top);
				
			}
		} 	
	}
	cout << "不能走到那里!" << endl;
	
}
int main()
{
	memset(vis,0,sizeof(vis));
	while(cin>>n>>m)
	{
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
				cin>>map[i][j];
				if(map[i][j]=='S')
				{
					sx=i;
					sy=j;
				} 
				if(map[i][j]=='G')
				{
					ex=i;
					ey=j;
				} 
				
			} 
		bfs();
	}  return 0;
 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114895.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月27日 下午8:00
下一篇 2021年9月27日 下午8:00


相关推荐

  • sortablejs — 强大的拖拽库

    sortablejs — 强大的拖拽库Sortable js 是一款优秀的 js 拖拽库 支持 ie9 及以上版本 ie 浏览器和现代浏览器 也可以运行在移动触摸设备中 不依赖 jQuery 支持 Meteor AngularJS React Vue Knockout 框架和任何 CSS 库 如 Bootstrap ElementUI 你可以用来拖拽 div table 等元素 一 sortablejs 最基本的示例 divid itxst divdata id a item1 lt divdata id a divid itxst

    2026年3月17日
    2
  • 数组与ArrayList 初始化

    数组与ArrayList 初始化一、数组初始化1.1静态初始化一维数组Type[]list={o1,o2,o3};二维数组1.2动态初始化一维数组Type[]list=newType[len];二维数组二、ArrayList初始化

    2025年6月11日
    7
  • 软件激活成功教程入门_软件激活成功教程修改内容

    软件激活成功教程入门_软件激活成功教程修改内容大家好我是长生第一次开通博客主要是为了记录我在激活成功教程学习中遇到的问题以及解决办法 激活成功教程初级入门第一步有壳查壳无壳直接载入OD 第二步 先打开OD 右键搜索ASCII 第三部crtl+f 搜索 注册失败关键提示字符第四步       返回OD主界面 在提示注册失败字符上方 寻找关键je 与关键jne,一般大跳即为关键跳,这个时候右键nop填充,在保存文件 这个时候…

    2026年2月8日
    3
  • goland激活码 大学【在线破解激活】[通俗易懂]

    goland激活码 大学【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    52
  • 提示词即智能体指南[项目源码]

    提示词即智能体指南[项目源码]

    2026年3月13日
    1
  • hadoop是什么意思_hadoop三大组件

    hadoop是什么意思_hadoop三大组件Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。[1]Hadoop实现了一个分布式文件系统(HadoopDistributedFileSystem),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(highthro

    2022年9月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号