C++周末训练题-机器人迷宫(BFS)
机器人迷宫
目录
- 机器人迷宫
- 目录
- 题目描述
- 格式要求
- 样例
- 数据大小
- 样例说明
- 错解
- 正解
题目描述
一个机器人需要巡逻一个m*n的迷宫(m行n列),一个单元格(i,j)表示第i行第j列,机器人每次只能从一个格子移到另一个格子,并只能像(i+1,j),(i-1,j),(i,j+1),或(i,j-1)这样移动到相邻的格子上。
网格中的一些格子中含有障碍物。为了穿过到含有障碍的格子,机器人必须切换到涡轮增压模式。因此,机器人不能连续穿过超过含k个障碍的网格。
你的任务是写一个程序,使得机器人从(1,1)到第(m,n)个格子的最短路径。输入保证起点与终点无障碍。
格式要求
输入格式
第一行:一个整数T,表示测试组数,每组测试数据的格式为:
第1行:两个整数m,n,表示迷宫的行数和列数, 第2行:一个整数k(k 小于 m 与n),表示允许机器人连续穿越的格子数。最后有m行n列个数字0 和 1,其中1表示第(i,j)个格子有障碍,0表示无障碍。
输出格式
每组数据一个整数表示最短路的长度。如果不能到达则输出-1。
样例
输入
3
2 5
0
0 1 0 0 0
0 0 0 1 0
4 6
1
0 1 1 0 0 0
0 0 1 0 1 1
0 1 1 1 1 0
0 1 1 1 0 0
2 2
0
0 1
1 0
输出
7
10
-1
数据大小
测试组数保证小于30
对于75%的数据 1 <= m,n <= 200
对于另外25%的数据 200 < m,n <= 500
样例说明
测试数据1
测试数据2
测试数据3
因为机器人最多能开0个时间单位,也就是无法开启涡轮增压模式,而起点和终点之间又重重障碍阻隔,所以机器人不能成功。
注:黑线代表机器人正常行走,红线代表机器人开启涡轮增压飞行。
错解
这熟悉的作风,一看就是BFS啦!
但是,我出现了一个疏忽!那就是——机器人在涡轮增压模式下只能直行。
//代码之后再放(找不到了)
正解
就这样吧,很难看的,(╯﹏╰)
//代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define M 500
#define N 250000
using namespace std;
int m,n,k;
bool maze[M+1][M+1],passed[M+1][M+1];
int R[4]={1,-1,0,0},C[4]={0,0,1,-1};
int x[N+1],y[N+1],q[N+1],d[N+1];
void scan()
{memset(passed,0,sizeof(passed));cin>>m>>n>>k;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)cin>>maze[i][j];
}
void bfs()
{int head=0,tail=1,nextx,nexty,nextq;x[1]=1,y[1]=1,passed[1][1]=1;while(head<tail){head++;for(int i=0;i<4;i++){nextx=x[head]+R[i];nexty=y[head]+C[i];nextq= maze[nextx][nexty]? q[head]+1:0;if(min(nextx,nexty)<=0||nextx>m||nexty>n)continue;if(passed[nextx][nexty]||nextq>k)continue;tail++;x[tail]=nextx;y[tail]=nexty;q[tail]=nextq;d[tail]=d[head]+1;//printf("%d %d->%d %d/%d\n",x[head],y[head],nextx,nexty,d[tail]);passed[nextx][nexty]=1;if(nextx==m&&nexty==n){printf("%d\n",d[tail]);return ;}}}printf("-1\n");
}
int main()
{//freopen("robot.in","r",stdin);//freopen("robot.out","w",stdout);int t;cin>>t;while(t--){scan();bfs();}
}
C++周末训练题-机器人迷宫(BFS)相关推荐
- [AcWing算法刷题]之DFS+BFS迷宫模板(简单)
题目来源: 题库 - AcWing 目录 DFS和BFS模板题目:迷宫类 机器人的运动范围 字母 迷宫 红与黑 棋盘问题 马走日 全球变暖 DFS综合类 乘积最大(提高课) 单词接龙(提高课) 取石 ...
- 华为机试二星题--机器人走迷宫
题目 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只能向x,y增加的方向走,不 ...
- 【动态规划】机器人走迷宫-BFS
机器人走迷宫-BFS 题目描述:给一个矩阵,0代表可走位置,1代表障碍物 给定起点和终点和行走规则(上.下.左.右),输出最短路径 探寻最短路径-BFS 首先定义两个辅助函数,valid_action ...
- 献给阿尔吉侬的花束(二刷,迷宫bfs,模板题)
文章目录 Question Ideas Code Question 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终 ...
- Tarjan相关最全(附训练题和答案)
Tarjan相关最全(附训练题和答案) 算法思想 Tarjan 强连通分量 割点 割桥 缩点 Kosaraju Garbow 训练 POJ2186 POJ1236 POJ2375 Luogu P338 ...
- 二级计算机为让利消费者,计算机二级office题库训练题(2)
D.计算机病毒是一个特殊的寄生程序 15. 以下关于编译程序的说法正确的是( ). A.编译程序属于计算机应用软件,所有用户都需要编译程序 B.编译程序不会生成目标程序,而是直接执行源程序 C.编译程 ...
- 如何用TensorFlow训练聊天机器人(附github)
前言 实际工程中很少有直接用深度学习实现端对端的聊天机器人,但这里我们来看看怎么用深度学习的seq2seq模型来实现一个简易的聊天机器人.这篇文章将尝试使用TensorFlow来训练一个基于seq2s ...
- 职称计算机windows 7,2017职称计算机考试Windows训练题
2017职称计算机考试Windows训练题 考试考点往往贯穿在平时我们练习的习题中,下面是小编给大家提供的职称计算机考试Windows训练题,大家可以参考练习,更多习题练习请关注应届毕业生考试网. 1 ...
- c语言编程思维训练50题,c语言逻辑思维训练题一
c语言逻辑思维训练题一 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 要求:用java实现下面的所有题目,2012年11月1日提交 ...
最新文章
- Netbeans学习总结
- java如何构造ajax回调参数,jQuery实现ajax回调函数带入参数的方法示例
- P6855-「EZEC-4.5」走方格【dp】
- 如何监视ps/查询的性能和使用
- springboot实现单点登录_什么是单点登录,php是如何实现单点登录的
- VMware Player 12.5.0 中文免费版
- seajs的模块化开发--实践笔记
- 万元奖金 , 百万流量 , 助你成为CSDN超级红人 !
- Phome开发历程分享——Enjoy the Beginning
- 190530每日一句
- PID参数整定快速入门(调节器参数整定方法)
- 如何免费获取国外硕博学位论文全文资源
- 什么是Cutoff Scores/Marks?
- 洛谷P4704 太极剑(乱搞)
- 快递电子面单接口php,快递电子面单
- LeetCode——线段树
- docker网络原理及cgroup
- 第八届中国高等院校设计作品大赛启动
- 【环境配置】配置jdk
- 闭环二阶系统阻尼比和阶跃响应超调量的关系(笔记)
热门文章
- 3DMAX利用IGame导出骨骼动画概要
- 科技新品 | 富士胶片研发出全球最大容量数据流磁带;iGame发布内存新品“古德白”...
- day03 Http协议Request
- springboot结合shiro中anon配置失效
- Ambarella公司申请首次公开招股
- C语言程序设计现代方法(第二版)十二章编程题答案
- Linux内核中内存分配函数
- 上界通配符、下界通配符
- Python 进程 自定义进程子类 继承
- Android深入浅出系列课程---Lesson13 LLY110529_虚拟机概述,JIT概述