博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codevs——3344 迷宫
阅读量:6810 次
发布时间:2019-06-26

本文共 2226 字,大约阅读时间需要 7 分钟。

3344 迷宫

 

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 
Description

小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

输入描述 
Input Description

第一行有三个数n,m表示迷宫有n行,m列。

第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

输出描述 
Output Description

至少走几步可以按规定走完,如果不行,输出“Impossible”

样例输入 
Sample Input

5 5

A002B

022C0

000D0

00222

0000E

样例输出 
Sample Output

26

数据范围及提示 
Data Size & Hint

0%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“B”。

30%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“G”。

50%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“Z”。

10%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“B”。

30%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“G”。

100%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“Z”。

 

bfs

以A为起点以B为终点,以B为起点以C为终点、、、以此类推,跑sum遍bfs找出每一个点到它下一个点的最小值,然后累加就可以了。

不要忘了判断没有路的情况

#include
#include
#include
#include
#include
#include
#define N 210using namespace std;char ch;bool flag;int dis[N][N],map[N][N];int n,m,sx,sy,ex,ey,sum,ans;int xx[4]={ 0,0,1,-1},yy[4]={ 1,-1,0,0};int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f;}struct Node{ int x,y;}node[50],que;queue
q;void bfs(int sx,int sy){ while(!q.empty()) q.pop(); memset(dis,0x3f3f3f3f,sizeof(dis)); dis[sx][sy]=0; que.x=sx,que.y=sy,q.push(que); while(!q.empty()) { Node p=q.front();q.pop(); if(p.x==ex&&p.y==ey) {ans+=dis[ex][ey]; return ;} for(int i=0;i<4;i++) { int fx=p.x+xx[i],fy=p.y+yy[i]; if(fx<0||fy<0||fx>n||fy>m||!map[fx][fy]) continue; if(dis[fx][fy]<=dis[p.x][p.y]+1) continue; dis[fx][fy]=dis[p.x][p.y]+1; que.x=fx,que.y=fy; q.push(que); } } flag=true;}int main(){ n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>ch; if(ch=='2') map[i][j]=0; else map[i][j]=1; if(ch>='A'&&ch<='Z') { sx=ch-'A'+2; sum=max(sx,sum); node[sx].x=i; node[sx].y=j; } } for(int i=2;i<=sum;i++) { sx=node[i].x,sy=node[i].y; if(i==sum) ex=node[2].x,ey=node[2].y; else ex=node[i+1].x,ey=node[i+1].y; bfs(sx,sy); } if(flag) printf("Impossible"); else printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/z360/p/7594032.html

你可能感兴趣的文章
一起谈.NET技术,.NET框架:为什么我们要尽量使用框架内建的功能,而不是重新发明...
查看>>
云计算中我们是否需要LAMP的PaaS?
查看>>
研究称Android内核存在漏洞 黑客可窃取电邮
查看>>
C#缺省参数可以让代码变得更加简洁明了与时俱进心里敞亮了很多了
查看>>
【自然框架】js版的QuickPager分页控件 V2.0
查看>>
poj-2049 Finding Nemo *
查看>>
模块化编程本质探讨
查看>>
java中equals和==的区别
查看>>
利用博客与视频分享和交流知识和经验
查看>>
知道二叉树前序和中序序列打印后序序列
查看>>
js操作dom对象
查看>>
由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目
查看>>
小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用
查看>>
Windows 8 异步编程
查看>>
基本控件使用实例-用户登录设计
查看>>
[转]javascript图片放大效果
查看>>
Jquery常用技巧(3)
查看>>
Struts2系列——struts2的result
查看>>
UE4 Log
查看>>
ldd 查看程序/动态库 的依赖
查看>>