题目选自洛谷P1825

题目比较长,但是不难理解。因为求的是一个最短距离,所以用BFS即可。

广搜的主要思想便是将所有可行解(可到达的点)放入队列,然后再一个个遍历所有可行解(可到达的点),知道找到终点为止。

难点在于对传送门的判断,这里我们采用每次取队首来先判断是不是传送门,如果是传送门,则改变队首的坐标,如果不是,则进行四个方向的遍历既可。这样在四个方向上不用再次判断下一个位置是不是传送门。

当然也可以一开始不判断,在四个方向遍历的时候,判断是否是传送门,如果是,则将它对应的另一个传送门入队,结果也是一样的。

题目描述

This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from one point in the maze to another. The slides work in both directions: a cow can slide from the slide's start to the end instantly, or from the end to the start. If a cow steps on a space that hosts either end of a slide, she must use the slide.

The outside of the corn maze is entirely corn except for a single exit.

The maze can be represented by an N x M (2 <= N <= 300; 2 <= M <= 300) grid. Each grid element contains one of these items:

* Corn (corn grid elements are impassable)

* Grass (easy to pass through!)

* A slide endpoint (which will transport a cow to the other endpoint)

* The exit

A cow can only move from one space to the next if they are adjacent and neither contains corn. Each grassy space has four potential neighbors to which a cow can travel. It takes 1 unit of time to move from a grassy space to an adjacent space; it takes 0 units of time to move from one slide endpoint to the other.

Corn-filled spaces are denoted with an octothorpe (#). Grassy spaces are denoted with a period (.). Pairs of slide endpoints are denoted with the same uppercase letter (A-Z), and no two different slides have endpoints denoted with the same letter. The exit is denoted with the equals sign (=).

Bessie got lost. She knows where she is on the grid, and marked her current grassy space with the 'at' symbol (@). What is the minimum time she needs to move to the exit space?

去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发,到达这个装置的起点。如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。

玉米迷宫的外部完全被玉米田包围,除了唯一的一个出口。

这个迷宫可以表示为N×M的矩阵(2 ≤ N ≤ 300; 2 ≤ M ≤ 300),矩阵中的每个元素都由以下项目中的一项组成:

 玉米,这些格子是不可以通过的。

 草地,可以简单的通过。

 一个装置的结点,可以将一头奶牛传送到相对应的另一个结点。

 出口

奶牛仅可以在相邻两个格子之间移动,要在这两个格子不是由玉米组成的前提下才可以移动。奶牛能在一格草地上可能存在的四个相邻的格子移动。从草地移动到相邻的一个格子需要花费一个单位的时间,从装置的一个结点到另一个结点需要花费0个单位时间。

被填充为玉米的格子用“#”表示,草地用“.”表示,每一对装置的结点由相同的大写字母组成“A-Z”,且没有两个不同装置的结点用同一个字母表示,出口用“=”表示。

Bessie在这个迷宫中迷路了,她知道她在矩阵中的位置,将Bessie所在的那一块草地用“@”表示。求出Bessie需要移动到出口处的最短时间。

例如以下矩阵,N=5,M=6:

###=##
#.W.##
#.####
#.@W##
######

唯一的一个装置的结点用大写字母W表示。

最优方案为:先向右走到装置的结点,花费一个单位时间,再到装置的另一个结点上,花费0个单位时间,然后再向右走一个,再向上走一个,到达出口处,总共花费了3个单位时间。

输入格式

第一行:两个用空格隔开的整数N和M;

第2-N+1行:第i+1行描述了迷宫中的第i行的情况(共有M个字符,每个字符中间没有空格。)

输出格式

一个整数,表示Bessie到达终点所需的最短时间。

输入输出样例

输入 1

5 6
###=##
#.W.##
#.####
#.@W##
######

输出 1

3

解题代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<queue>
using namespace std;
int n,m; int sx,sy,ex,ey,ans; //记录开始、结束位置和需要的步数
char Map[301][301];
int book[301][301];
int nt[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //四个方向
int nx,ny;
struct node{int x,y,step;
};
queue<node> q;
void change(int &a,int &b){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(Map[i][j]==Map[a][b] && (i!=a || j!=b)){a=i,b=j;return;}}}
}
void bfs(int sx,int sy){q.push(node{sx,sy,0}); book[sx][sy]=1;node ft; //队首结点int nx,ny;while(!q.empty()){ft = q.front();if(ft.x==ex && ft.y==ey) {ans=ft.step;break;}if(Map[ft.x][ft.y]>='A' && Map[ft.x][ft.y]<='Z'){ //如果是传送门,则先改变坐标change(ft.x,ft.y);}for(int i=0;i<4;i++){ //枚举四个方向nx=ft.x+nt[i][0]; ny=ft.y+nt[i][1];if(nx>=1&&nx<=n&&ny>=1&&ny<=m && book[nx][ny]!=1 && Map[nx][ny]!='#'){//如果能走 没走过 不是玉米book[nx][ny] = 1;q.push(node{nx,ny,ft.step+1});}}q.pop();}
}
int main(){cin>>n>>m;//读入地图  顺便记录位置for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>Map[i][j];if(Map[i][j]=='@') sx=i,sy=j;if(Map[i][j]=='=') ex=i,ey=j;}bfs(sx,sy);cout<<ans;return 0;
}

广度优先搜索——Corn Maze S(洛谷 P1825)相关推荐

  1. 广度优先搜索——奇怪的电梯(洛谷 P1135)

    广度优先搜索普及/提高篇,今天讲述的是洛谷里的一道题 奇怪的电梯(洛谷 P1135) 说一下我解题时候的思路吧. 首先读清楚题目,题目要求输出从 a楼 到 b楼的最少次数,楼层必须在[1,n]之间升降 ...

  2. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  3. 广度优先搜索——填涂颜色(洛谷 P1162)

    题目选自洛谷P1162 首先讲一下思路:根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了.(因为圈只有一个,那么当找到第一个1之后便要打断循环,很重要!) ...

  4. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

  5. 深度优先搜索——八皇后问题(洛谷 P1219)

    题目选自洛谷P1219     该题针对6-13皇后都行,只需改动输入的数字. 八皇后问题是经典的DFS问题,唯一需要注意的就是判断能够放置的条件,即满足什么状况是对的. 题目要求不能在同一行,同一列 ...

  6. 【搜索】NOIP2000 or 洛谷1019单词接龙

    题目链接:洛谷1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在 ...

  7. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

    题目描述 去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移.这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发, ...

  8. DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

    一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...

  9. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

最新文章

  1. 安装Nginx时报错 the HTTP cache module requires md5 functions
  2. libSVM介绍(二)
  3. 有关代码段、数据段、BOSS段、堆、栈的存储位置问题。。。
  4. Java面试之锁-自旋锁
  5. 无法加载站点/服务的所有 ISAPI 筛选器,因此启动中止——Service Unavailable解决方法合集...
  6. 库仑计BQ27441使用
  7. oracle队列java_oracle 队列
  8. c语言创意作业蜂鸣器,蜂鸣器c语言程序_c语言编写蜂鸣器发声
  9. 【VBA】excel客户数据打印录入控件
  10. vue结合elementui实现输入框输入关键词显示下拉列表点击列表中关键字页面滚动到关键字所在位置
  11. 最新高品质+武汉城区建筑物范围面shp格式+小区大厦学校医院占地面积
  12. 技术研究:DOOM3网络模型的演化与网络架构
  13. mysql5.7架设征途服务器_征途手工架设服务端+配套双客户端+架设流程
  14. 观李永乐老师《双蛋问题》解题后感
  15. 这些前端资源,你值得拥有
  16. JAVA idea建包的时候com.不分开
  17. Proteus仿真电路笔记
  18. 互联网寒冬,7面阿里,终获Offer,定级P6+
  19. 应用Maple软件推导直升机旋翼的气动力和力矩
  20. 2019上海米其林指南榜单出炉 | 附全部名单、地址、人均消费

热门文章

  1. apache虚拟主机名不区分大小写的解决办法
  2. flex3+blazeds+spring+hibernate整合小结
  3. php软件开发--yii2框架搭建及gitlib同步线上网站
  4. nginx之lua_shared_dict
  5. Unity3d查找游戏对象
  6. gitlab贡献率_如何为GitLab做贡献
  7. 开发者日记级别哪个好_什么是开发者日记?
  8. uefi引导linux_使用UEFI双重引导Windows和Linux
  9. oneplus 驱动_OnePlus投放CyanogenMod,Raspberry Pi 2驱动的机器人等
  10. editor编辑器为什么头部信息会不见_简单聊一聊一个前端编辑器的性能优化