对称飞行器
小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点。
每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位瞬移到关于当前自己点中心对称的格子,且每一次移动的目的地不能存在障碍物。
具体来说,设当前迷宫有

n 行

m 列,如果当前小强操控的人物位于点

(

,

)
A(x,y),那么关于点

A 中心对称的格子

(


,


)
B(x

,y

) 满足

+


+
1
x+x

=n+1 且

+


+
1
y+y

=m+1 。
需要注意的是,对称飞行器最多使用
5
5次。
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行两个空格分隔的正整数 ,分别代表迷宫的行数和列数。
接下来 行 每行一个长度为 的字符串来描述这个迷宫。
其中
代表通路。
代表障碍。
代表起点。
代表终点。
保证只有一个 和 一个 。

输出描述:
仅一行一个整数表示从起点最小花费多少时间单位到达终点。
如果无法到达终点,输出 。
示例1
输入例子:
4 4
#S…
E#…
#…

输出例子:
4
例子说明:
一种可行的路径是用对称飞行器到达 \text (4,3) 再向上走一步,再向右走一步,然后使用一次对称飞行器到达终点。

题解

再开一维,表示风行器使用的次数,就可以了,剩下的就是简单的BFS搜索。

AC代码

#include<bits/stdc++.h>
using namespace std;
struct Node
{int x,y,fly, step;
};
queue<Node>q;
int n,m;
string mp[505];
bool vis[505][505][6];
int xx[4] = {0,0,-1,1};
int yy[4] = {-1,1,0,0};
int bfs()
{while(!q.empty())q.pop();Node t;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(mp[i][j]=='S'){t.x = i, t.y = j;break;}}}t.fly = 5;t.step = 0;memset(vis,0,sizeof(vis));vis[t.x][t.y][t.fly] = true;q.push(t);while(!q.empty()){t = q.front();q.pop();for(int i=0;i<2;i++){if(i==0){for(int j=0;j<4;j++){Node w;w.fly = t.fly;w.step = t.step + 1;w.x = t.x + xx[j];w.y = t.y + yy[j];if(w.x<0||w.x>=n||w.y<0||w.y>=m)continue;if(mp[w.x][w.y]=='#')continue;if(vis[w.x][w.y][w.fly])continue;if(mp[w.x][w.y]=='E')return w.step;vis[w.x][w.y][w.fly] = true;q.push(w);}    }else{if(t.fly<=0)continue;Node w;w.fly = t.fly - 1;w.step = t.step + 1;w.x = n - 1 - t.x;w.y = m - 1 - t.y;if(w.x<0||w.x>=n||w.y<0||w.y>=m)continue;if(mp[w.x][w.y]=='#')continue;if(vis[w.x][w.y][w.fly])continue;if(mp[w.x][w.y]=='E')return w.step;vis[w.x][w.y][w.fly] = true;q.push(w);}}} return -1;
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++)cin>>mp[i];cout<<bfs()<<endl;return 0;
}

4. 对称飞行器 -- BFS搜索相关推荐

  1. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  2. java灌水bfs二叉树,二叉树的BFS搜索

    本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解. 广度优先搜索算法( ...

  3. 【CCCC】L3-008 喊山 (30分),BFS搜索最长路,水题

    problem L3-008 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中 ...

  4. csu 最优对称路径(bfs+记忆化搜索)

    1106: 最优对称路径 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 371  Solved: 77 [Submit][Status][Web Bo ...

  5. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以'Y'和'M'的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到'@'更行最小值. PS: 如果用'Y'和'M'点分别去搜每个 ...

  6. ACM之八数码问题----BFS搜索----数独游戏的模拟(下)

    题目描述;数独游戏的内核代码 八数码问题; 编号为1到8的8个正方形滑块被摆成3行3列;(有一个格子留空); 每次可以把与空格相邻的滑块(有公共边才算相邻)移到空格中; 而它原来的位置就成为了新的空格 ...

  7. 猎人抓兔子的bfs搜索解法

    有五个山洞,一字排开,一只兔子住在某个洞,每天晚上会换住到相邻的洞中,一个猎人只能每天早上去一个洞,问怎样的检查序列能确保抓到兔子. 这个问题,可以说是一个智力题了,当然我的智力没有达标,所以没有想出 ...

  8. c++ bfs搜索详讲

    文章目录 一.bfs是什么? 二.bfs怎么用? bfs模板 简单例题1 中等例题2 高等例题3 总结 一.bfs是什么? bfs,广度搜索优先,是层序遍历的一种使用 一般用来求没有边权的情况下的最短 ...

  9. BFS 搜索 Problem 1012 Rescue 拯救天使

    Problem ID:1012 Rescue 简单题意:给出一个地图,其中有一个"a",代表angle,若干个"r",代表去营救angle的朋友,"x ...

最新文章

  1. function $(id) {}表示什么函数
  2. Linux 服务器高并发调优实战
  3. Qt中QMap删除元素的简单使用
  4. vue data属性中的值绑定到dom上的一些问题
  5. js 如何将java list集合转换成var类型数组_零基础参加郑州Java培训 一定要注意Arrays.asList的用法...
  6. C语言钩子函数获取键盘事件,(C#)透过键盘钩子获取ScanCode/VkCode
  7. SpringBoot签名验签
  8. 数据可视化ECharts:饼形图2 地区分布模块制作(南丁格尔玫瑰图)
  9. 苹果手机备份有必要吗_旧手机里的便签能备份到新手机里吗?
  10. execjs 模块 call() 方法报错 AttributeError: ‘NoneType‘ object has no attribute ‘replace‘
  11. JS unshift() 方法
  12. 第5章 字典之物品清单
  13. 如画的水乡,如画的同里1012
  14. 启用微软e5子账户的outlook邮箱,解决 qyi 续订程序无法刷新令牌问题
  15. 软件测试 - Linux的常用命令
  16. 读文件并算出平均数&找出排名前3的成绩(c语言 可运行)
  17. 2022年苏州大学872真题整理【回忆版】
  18. 米思齐Mixly图形化编程---遥控灯
  19. 国泰君安国际连续第五年获《彭博商业周刊》“金融机构大奖”
  20. Rust语言- 匹配器 match

热门文章

  1. postgres 保存报错duplicate key value violates unique constraint...解决方案_亲测有效
  2. 信贷风控NCL净损失率的指标实现与应用
  3. 彻底理解位运算——左移、右移
  4. BlenderGIS生成三维地图白模
  5. 媲美5G的Wifi网速、“备战”资产一键领……揭秘双11小二背后的保障力量
  6. sql server 错误53
  7. 威胁情报如何改进 DDoS 保护
  8. 原子类型:AtomicInteger认识
  9. (C语言)小玉家的电费
  10. 网站流量突然下降应该怎么找原因?