1251:仙岛求药 2021-01-05

简介: 1251:仙岛求药 2021-01-05

1251:仙岛求药

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

下图 显示了一个迷阵的样例及李逍遥找到仙药的路线。

【输入】

输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:

1)‘@’:少年李逍遥所在的位置;

2)‘.’:可以安全通行的方格;

3)‘#’:有怪物的方格;

4)‘*’:仙药所在位置。

当在一行中读入的是两个零时,表示输入结束。

【输出】

对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。

【输入样例】

8 8

.@##...#

#....#.#

#.#.##..

..#.###.

#.#...#.

..###.#.

...#.*..

.#...###

6 5

.*.#.

.#...

..##.

.....

.#...

....@

9 6

.#..#.

.#.*.#

.####.

..#...

..#...

..#...

..#...

#.@.##

.#..#.

0 0

【输出样例】

10

8

-1

1. #include <iostream>
2. #include <cstdio>
3. #include <cstring>
4. using namespace std;
5. int dt[22][22],book[200][4];
6. int m,n,x1,y1,x2,y2,s;
7. int x3[4]={-1,1,0,0};
8. int y3[4]={0,0,-1,1};
9. void bfs(int x1,int y1,int x2,int y2){
10.   int x,y,top=0,teil=1;
11.   dt[x1][y1]=1;
12.   book[1][1]=x1;book[1][2]=y1;book[1][3]=0;
13.   while(teil>top){
14.     top++;
15.     for(int i=0;i<4;i++){
16.       x=book[top][1]+x3[i];
17.       y=book[top][2]+y3[i];
18.       if(x>0&&x<=m&&y>0&&y<=n&&dt[x][y]==0){
19.         teil++;dt[x][y]=1;book[teil][3]=book[top][3]+1;
20.         book[teil][1]=x;book[teil][2]=y;
21.         if(x==x2&&y==y2){
22.           printf("%d\n",book[teil][3]);return;
23.         }
24.       }
25.     }
26.   }
27.   printf("-1\n"); 
28. }
29. int main(int argc, char *argv[])
30. {
31.   char ch;
32.   while(1){
33.     scanf("%d %d",&m,&n);
34.     if(m==0&&n==0)return 0;
35.     memset(book,0,sizeof(book));
36.     memset(dt,0,sizeof(dt));
37.     for(int i=1;i<=m;i++)
38.       for(int j=1;j<=n;j++){
39.         cin>>ch;
40.         if(ch=='@'){x1=i;y1=j;dt[i][j]=0;}
41.         else if(ch=='*'){x2=i;y2=j;dt[i][j]=0;}
42.         else if(ch=='#')dt[i][j]=1;
43.         else if(ch=='.')dt[i][j]=0;
44.       }
45.     bfs(x1,y1,x2,y2);
46.   }
47.   return 0;
48. }

 

相关文章
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
3610 0
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
|
8月前
【冷门快捷键】设置VSCode终端大小最小化快捷键Alt+PageUp/PageDown、编辑代码窗口切换大小快捷键Alt+数字键盘“+”、Alt+数字键盘“-”、Alt+数字键盘“0”
【冷门快捷键】设置VSCode终端大小最小化快捷键Alt+PageUp/PageDown、编辑代码窗口切换大小快捷键Alt+数字键盘“+”、Alt+数字键盘“-”、Alt+数字键盘“0”
|
8月前
|
C语言
c语言编程练习题:7-18 出租车计价
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。
374 1
|
8月前
|
XML JavaScript Java
Java一分钟之-XML解析:DOM, SAX, StAX
Java中的XML解析包括DOM、SAX和StAX三种方法。DOM将XML加载成内存中的树形结构,适合小文件和需要随意访问的情况,但消耗资源大。SAX是事件驱动的,逐行读取,内存效率高,适用于大型文件,但编程复杂。StAX同样是事件驱动,但允许程序员控制解析流程,低内存占用且更灵活。每种方法都有其特定的易错点和避免策略,选择哪种取决于实际需求。
166 0
|
8月前
|
存储 算法 C语言
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
148 0
|
8月前
|
C++ 容器
[C++] 对二维数组中的二维坐标点x,y进行排序
[C++] 对二维数组中的二维坐标点x,y进行排序
206 0
|
Java
Java 创建文件自动新增父目录、查询目录文件、删除文件目录下面的文件
要处理文件保存和删除的操作,记录一下以免遗忘: 1、创建文件,并且自动创建父目录 2、删除目录下面的所有文件
173 0
|
前端开发 Java 应用服务中间件
javaWeb 常见面试题 20道,建议收藏
javaWeb 常见面试题 20道,建议收藏
256 0
|
缓存 API 网络架构
架构风格:你真的懂REST吗?
本文探讨如下几个问题: 什么是REST REST包含哪些约束 什么是RESTful 纯RESTful API的难点在哪里 如果你去搜索「什么是REST」的话,大部分情况下,你看到的基本都是RESTful! 这类内容主要说的是: 资源URL应该怎么写 要用GET来获取资源 要用POST来新建资源...
1672 0
|
Java Maven
Maven手工安装jar包到本地仓库
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/50462789 使用maven,少不了的就是要被“包下载失败”这样的问题折腾。
1936 0

热门文章

最新文章

下一篇
开通oss服务