SDJZUOJ迷宫问题(BFS)

来源:互联网 发布:数据共享方式 编辑:程序博客网 时间:2024/06/05 15:58

题目描述

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入格式

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

9

</pre><pre name="code" class="cpp">/*15 5S-###-----##---E#------##*/#include<stdio.h>#include<iostream>using namespace std;struct note{    int x;//横坐标    int y;//纵坐标    int s;//走的步数};struct note que[2051];char a[51][51];int i,j,k,n,m,startx,starty,p,q,ty,tx,flag;int book[51][51];int next[4][2]={{0,1},                {1,0},                {0,-1},                {-1,0}};void bfs(){        //队列初始化    int head=1;    int tail=1;    //往队列插入迷宫的入口坐标    que[tail].x=startx;    que[tail].y=starty;    que[tail].s=0;    tail++;    book[startx][starty]=1;    flag=0;//用来标记是否到达目的地,0表示没有    while(head<tail)//当队列不为空时候    {        //枚举四个方向(注意方向数组的设置和for循环的遍历,通用模板)        for(k=0;k<=3;k++)        {            //计算下一个点坐标            tx=que[head].x+next[k][0];             ty=que[head].y+next[k][1];             //判断是否越界             if(tx<1||tx>n||ty<1||ty>n)                 continue;            //判断是否是障碍物或者已经在路径中            if(a[tx][ty]!='#'&&book[tx][ty]==0)//此处不能写 a[tx][ty]=='-',因为这样起点就进不了队列中            {                //把这个点标记为已经走过                //注意宽带搜索每个点只能入队列一次 ,和dfs不同,所以book的值不需要恢复为0;                book[tx][ty]=1;                //插入新的点到队列中                que[tail].x =tx;                que[tail].y=ty;                que[tail].s=que[head].s+1;                tail++;             }             //如果到了目的地,停止扩展,任务结束,退出循环             if(tx==p&&ty==q)             {                 //注意这两句话千万位置不能颠倒                 flag=1;                 break;                  }                       }         if(flag==1)             break;         head++;//这个地方千万不能忘记,当一个点扩展结束后,head++才能使得后面的点再进行扩展     }     //打印队列中末尾最后一个点的步数     //注意tail是指向队尾的下一个位置,所以需要-1     cout<<que[tail-1].s;          }int main(){    cin>>n>>m;    for(i=1;i<=n;i++)    {        for(j=1;j<=m;j++)        {            cin>>a[i][j];            if(a[i][j]=='S')            {                startx=i;                starty=j;            }            if(a[i][j]=='E')            {                p=i;                q=j;            }                        }    }    bfs();    return 0; }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 抽烟多了老咳嗽怎么办 抽烟抽多了咳嗽怎么办 嗓子咳出异物臭怎么办 鼻子有鼻涕喉咙有痰怎么办 怀孕39周感冒了怎么办 一口痰卡在喉咙怎么办 鼻塞黄鼻涕黄痰怎么办 小孩咳嗽流黄鼻涕怎么办 小孩鼻塞怎么办最简单方法 有黄鼻涕黄痰怎么办 咳嗽有泡沫白痰怎么办 痰多咳嗽老不好怎么办 5岁儿童咳嗽有痰怎么办 感冒后一直有痰怎么办 感冒吐绿色的痰怎么办 孕妇咳嗽有痰怎么办啊 没结婚的人死了怎么办 金花鼠尾巴断了怎么办 辞职交了不批怎么办 离职了又想回去怎么办 想辞职领导不批怎么办 急辞职领导不批怎么办 她生气不理我了怎么办 分手了之前的钱怎么办 结婚后老公变了怎么办 我不小心出轨了怎么办 微博账号被锁定怎么办 微博被盗号了怎么办 如果微博被盗了怎么办 老公炒股亏光了怎么办 新id密码不匹配怎么办 手机不识别sd卡怎么办 小米手环容易掉怎么办 小米4gps信号弱怎么办 小米4内存不够用怎么办 地暖放气阀漏水怎么办 暖气排气阀堵了怎么办 跳绳一只脚腕疼怎么办 牙齿不能吃冷的怎么办 牙齿不敢吃凉的怎么办 蛀牙吃凉的就疼怎么办