Link

题目描述:

玛丽是一个善良的小女孩,她养了一只可爱的小羔羊,有一天,小羔羊走丢了,这可急坏了玛丽!
听好心人告知,小羔羊迷失在一个N行M列的场景里(从上往下依次是1~ N行,地面为第N行,从左往右依次为1~M列)。最开始,玛丽站在地面上的,地面是一个连续无断点的平台,玛丽可以左右来回走。
玛丽有一把梯子,用于她上下平台(注意:梯子只能用于上下平台),玛丽是个女孩,所以下平台时她不会像男生那样鲁莽地跳下去,也得借助梯子,梯子可以无限次使用。也就是说:如果梯子的长度是L的话,玛丽可以从位置(i1, j) 爬到位置(i2, j),前提是两个位置都是平台,且fabs(i1 - i2) ≤ L。如图四可知,梯子太长了,玛丽携带不方便,她希望梯子越短越好,但是梯子太短,又不能到达某些必经的平台,矛盾啊~
请你帮助玛丽,求得一个能找到小羔羊的最短梯子长度。

输入格式:

第一行:2个整数N和M,表示场景大小。
接下来N行,每行M个字符,‘.’表示空中,大写的‘X’表示某平台。
最后一行:两个整数x,y,表示小羔羊所在的位置。小羔羊的位置保证是’X’。

输出格式:

1个整数,表示能找到小羔羊的最短梯子长度。

思路:

将玛丽找羊转化为羊到地面,这是等价且方便的。那么我们就以羊的坐标为起点,反向暴搜。

还需要先二分出梯子的长度,再进行 BFS。具体看注释。

Code:

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int n, m, sx, sy;
bool f[55][55], vis[55][55];
struct node {int x, y;
};
bool bfs(int l) { // 思路是将问题转化成小羊通过梯子到达地面,反向暴搜 memset(vis, 0, sizeof(vis));queue<node> q; q.push((node){sx, sy}); // 小羊的初始位置while(!q.empty()) {node p = q.front();q.pop();int dx = p.x, dy = p.y;// leftdy --; // 左移 if(f[dx][dy] and !vis[dx][dy]) {vis[dx][dy] = 1;q.push((node){dx, dy});}// right dy += 2; // 先回到原位,再向右移if(f[dx][dy] and !vis[dx][dy]) {vis[dx][dy] = 1;q.push((node){dx, dy});}dy --; // 恢复 // upfor(int i = 1;i <= l; ++i) { // 从小到大,因为先到最近的地方 dx -= i;if(f[dx][dy] and !vis[dx][dy]) {vis[dx][dy] = 1;q.push((node){dx, dy});dx += i;break;}dx += i;} // downfor(int i = 1;i <= l; ++i) {dx += i;if(dx == n) return 1; // 到达地面,说明梯子长度符合if(f[dx][dy] and !vis[dx][dy]) {vis[dx][dy] = 1;q.push((node){dx, dy});dx -= i;break;}dx -= i;} } return 0;
}int binary(int left, int right) {while(left <= right) { // 必须是小于等于,以免漏掉答案int mid = left + right >> 1;if(bfs(mid) and !bfs(mid - 1)) // 当前长度恰好可以,稍微小一点都不行return mid;else if(bfs(mid)) // 可以但不是最小right = mid;else left = mid + 1;// 长度偏小}
//  return left; // 其实小于也是可以的,只需最后返回left
}
int main() {scanf("%d %d", &n, &m);for(int i = 1;i <= n; ++i) {scanf("%*c");for(int j = 1;j <= m; ++j) {char c = getchar();f[i][j] = (c == 'X' ? 1 : 0);}}scanf("%d %d", &sx, &sy);if(sx == n) {putchar('0');return 0;}printf("%d", binary(1, n - sx)); // 最大长度就是羊从当前台阶直接到地面 return 0;
}

【玛丽有只小羔羊】题解相关推荐

  1. Python版基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式

    基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式 按空格进入单人模式,按't'进入双人模式,双人模式下玛丽1采用空格键上跳,玛丽2采用方向上键上跳. 完整代码下载地址:Pyth ...

  2. 基于Python的《玛丽冒险》小游戏

    开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 8.Windows 10. Python版本:Python 3.7.0. 开发工具:PyCharm. ...

  3. [美术作品]小玛丽·莎托莉丝[英]弗雷德里克·莱顿作品

    (http://www.fx.edu.sh.cn/ziyuan/xksc/meishu/jindaiouzhou/page24/xiaomali.htm ) 弗雷德里克·莱顿大约从1869年起被擢升为 ...

  4. 培养你的“翁格玛丽”

    一家外贸公司的一位下属季度的销售结果大大超出了老板的期望值. 老板激动得不知如何是好,当即从办公桌上拿起一只香蕉塞到下属手里:"请原谅我眼下只有这个东西,我只是想让你知道,我对你做的这件事情 ...

  5. 互联网女皇玛丽·米克尔发布互联网新趋势报告

    北京时间5月31日消息,华尔街著名证券分析师和投资银行家.有"网络女皇"之称的玛丽·米克尔(Mary Meeker)在D10数字大会上发布了其著名的互联网趋势报告. 以下为其演讲环 ...

  6. 漫话香槟123从玛丽莲开始

    漫话香槟 传说玛丽莲·梦露喜欢用香槟酒洗澡,还有人说海明威在巴黎里茨饭店下榻时,每天早餐都要喝掉两瓶香槟.至于那些富有的品酒行家,更是不惜为一瓶上品香槟而一掷千金. 如今香槟酒已经成了全世界无可替代的 ...

  7. Codevs 1021 玛丽卡

    Codevs 1021 玛丽卡 题目地址:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他 ...

  8. 玛丽卡(codevs 1021)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  9. 恩斯特•施图林格(Ernst Stuhlinger)博士 给 玛丽•尤肯达(Mary Jucunda)修女 的回信

    这是网上流传的文章,不解释,看文章. 1970年,赞比亚修女玛丽·尤肯达(Mary Jucunda)给恩斯特·施图林格(Ernst Stuhlinger)博士写了一封信.施图林格因在火星之旅工程中的原 ...

最新文章

  1. 最流行的解压缩软件--winrar
  2. phpjson多层乱码解决
  3. MVC --.Routing
  4. 【干货】策划一个线上活动的整体流程
  5. 剪贴板所有api函数
  6. php sha256hex,crypto/sha256(加密/sha256)
  7. linux 中 id指令,Linux id 命令
  8. org.springframework.hateoas.mvc.ControllerLinkBuilder之ClassNotFoundException的错误
  9. 小程序推广引导下载app的解决办法
  10. Towards Real-Time Multi-Object Tracking(JDE)
  11. flex 调用 flash影片剪辑
  12. 2022程序员必备网站
  13. js+ajax编码三级联动
  14. 笑死人的12星座宝贝
  15. bzoj1190梦幻岛宝珠
  16. Linux网络编程-七
  17. 猎黑马决策股票炒股软件 主升浪战法 短线涨停
  18. 从MPU6050了解姿态解算
  19. VSCode配置 for Mac(一)C++
  20. 面试连环炮之Mysql

热门文章

  1. Flutter组件--AppBar相关属性
  2. 个人开发环境配置 (macOS 篇)
  3. 北京交通计算机技术分数线,2020北京交通大学录取分数线一览表(含2018 2019历年)...
  4. openstack基础之python WSGI,paste,Routes,webob
  5. Docsify Markdown表格列宽自定义
  6. 循环-13. 求特殊方程的正整数解(15)
  7. php在线模拟高考志愿,志愿绿卡|职业测试|模拟志愿填报-高考志愿网
  8. Berkeley 二十年 UNIX 历史
  9. 基于SSH的安全远程登录
  10. Cauchy积分定理