宽度优先搜索第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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 高质量SQL书写的30条建议

    高质量SQL书写的30条建议

    2020年11月9日
    160
  • 三分钟明白 Activiti工作流 — java运用[通俗易懂]

    三分钟明白 Activiti工作流 — java运用[通俗易懂]一、什么是工作流以请假为例,现在大多数公司的请假流程是这样的员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑采用工作流技术的公司的请假流程是这样的员工使用账户登录系统——点击请假——上级登录系统点击允许就这样,一个请假流程就结束了有人会问,那上级不用向公司提交请假记录?公司不用将记录录入电脑…

    2022年4月30日
    110
  • renren-fast 与 renren-fast-vue 与 renren-generator 基本操作[通俗易懂]

    renren-fast 与 renren-fast-vue 与 renren-generator 基本操作[通俗易懂]一、前言公司主打产品的,近来发现了一款快速完成前后端CRUD的框架renren-fast,打算用它来“刷”小型的外包,积攒资金。个人觉得,renren-fast主要面向后台开发者,使用方式和Guns类似:使用Guns自动生成SpringBoot+LayUI的后台管理系统①由于完整开发文档需要费用,②前端使用vue,有的后台开发者不清楚。笔者参考了…

    2022年7月28日
    1
  • 几款软件加密/加壳工具的比较「建议收藏」

    几款软件加密/加壳工具的比较「建议收藏」几款.Net加密/加壳工具的比较前言使用过.NET的程序员都知道,.NET是一个巨大的跨时代进步,它开发效率高、功能强、界面观、耐用、新的语言C#已经提交为行业规范、CLR共公运行库资源丰富,这所有的特点标志着它成为主流编程语言是必然的。可是它也有一个缺点,那就是编译好的程序集可以完全反编译成源代码,这给一些不法份子提供了很好的机会,试想想,您辛苦的劳动成果就这样给了别…

    2022年4月19日
    875
  • pytorch之DataLoader

    pytorch之DataLoaderpytorch之DataLoader在训练神经网络时,最好是对一个batch的数据进行操作,同时还需要对数据进行shuffle和并行加速等。对此,PyTorch提供了DataLoader帮助实现这些功能。Dataset只负责数据的抽象,一次调用__getitem__只返回一个样本。DataLoader的函数定义如下:DataLoader(dataset,batch_size=1,shu…

    2022年5月6日
    47
  • 深入解析HashMap和currentHashMap源码以及实现原理「建议收藏」

    深入解析HashMap和currentHashMap源码以及实现原理「建议收藏」深入解析HashMap和ConcurrentHashMapy源码以及底层原理前言HashMap和ConcurrentHashMap,这两个相信大家都不陌生,在面试中基本上是必问的,以及在实际开发过程中也是比用的,那么看了这篇文章,无论在面试还是在实际开发中都可以顺手拈来,得心应手了。HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并

    2022年6月18日
    38

发表回复

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

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