LuoguP1126 机器人搬重物(BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126
思路:很不错的搜索题,用BFS,虐了我1天多才A掉 QAQ,细节很多。
1.每个状态包含行、列、方向、步数。
2.需要将格点图转换为点图。
3.注意边界不能走。
4.最后是折磨了大半天的,救赎最后输入的字符,我最开始是写的scanf("%d%d%d%d%c",&sr,&sc,&er,&ec,&d)。我一直在找算法部分的bug,怎么也没想到竟然是它没有读到输入的字符,而读的是空格。因为scanf虽然在读数据会吃掉空格和换行,但只有scanf读char时不会吃掉空格和换行,虽然以前碰到过一次,但还是没意识到啊...解决办法是在%c前加一个空格就行,吸取教训了,血的教训。
AC代码如下:
#include<cstdio>
#include<queue>
#include<iostream>
using namespace std; struct cur{
int r,c,dir,step;
}tmp;
queue<cur> q;
int gr[][]={{-,-,-},{,,},{,,},{,,}};
int gc[][]={{,,},{,,},{,,},{-,-,-}};
int n,m,sr,sc,er,ec;
int a[][];
bool vis[][][]; void bfs(){
q.push(tmp);
while(!q.empty()){
cur now=q.front();q.pop();
int nr=now.r,nc=now.c,nd=now.dir,ns=now.step;
if(nr==er&&nc==ec){
printf("%d\n",ns);
return;
}
for(int i=;i<;i++){
int rr=nr+gr[nd][i],cc=nc+gc[nd][i];
if(rr<=||cc<=||rr>=n||cc>=m||a[rr][cc])
break;
if(!vis[rr][cc][nd]){
tmp.r=rr,tmp.c=cc,tmp.dir=nd,tmp.step=ns+;
vis[rr][cc][nd]=true;
q.push(tmp);
}
}
for(int i=-;i<=;i+=){
tmp.r=nr,tmp.c=nc;
int dd=nd+i;
if(dd==)dd=;
if(dd==-)dd=;
tmp.dir=dd;
tmp.step=ns+;
if(!vis[nr][nc][dd]){
vis[nr][nc][dd]=true;
q.push(tmp);
}
}
}
printf("-1\n");
} int main(){
int x;
char d;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&x);
if(x)
a[i][j]=a[i-][j]=a[i-][j-]=a[i][j-]=;
}
scanf("%d%d%d%d",&sr,&sc,&er,&ec);
scanf(" %c",&d);
if(a[er][ec]){
printf("-1\n");
return ;
}
tmp.r=sr,tmp.c=sc;
switch(d){
case 'N':tmp.dir=;break;
case 'E':tmp.dir=;break;
case 'S':tmp.dir=;break;
case 'W':tmp.dir=;
}
tmp.step=;
vis[sr][sc][tmp.dir]=true;
bfs();
return ;
}
LuoguP1126 机器人搬重物(BFS)的更多相关文章
- 洛谷P1126机器人搬重物[BFS]
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 机器人搬重物(BFS)
机器人搬重物 时间限制: 1 Sec 内存限制: 128 MB提交: 22 解决: 10[提交][状态][讨论版] 题目描述 机 器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一 ...
- 洛谷P1126 机器人搬重物
洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷——P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷P1126 机器人搬重物【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...
- 洛谷 P1126 机器人搬重物 (BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...
- 【洛谷P1126】机器人搬重物
题目大意:给定一个 N 行,M 列的地图,一个直径为 1.6 的圆形机器人需要从起点走到终点,每秒钟可以实现:向左转,向右转,向前 1-3 步.求从起点到终点最少要多长时间. 题解:相比于普通的走迷宫 ...
随机推荐
- python使用smtplib发送邮件
python要实现发送邮件的功能,需要使用smtplib库. 1. 过程大致如下: 1. 建立和SMTP邮件服务器的连接 # 默认端口25 smtp = smtplib.SMTP(host, port ...
- ios ideviceintaller安装
1.安装brew 打开终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst ...
- VS:error C3872: '0xe044': this character is not allowed in an identifier解决方法
从网上粘贴代码到编译器中直接编译的话,会报这个错误,但是代码看上去是没有问题的,实际的原因是因为我们粘贴代码的时候粘贴了中文字符进来. 解决方法:就是把这段代码放到记事本里,选择替换把中文输入空 ...
- Spark分析之Dependency
在Spark中,每一个RDD是对于数据集在某一状态下的表现形式,比如说:map.filter.group by等都算一次操作,这个状态有可能是从前一状态转换而来的: 因此换句话说一个RDD可能与之前的 ...
- storm的代码实现
先模拟产生一些数据 我把这些数据摘一部分下来 2017-06-10 18:25:56,092 [main] [org.apache.kafka.common.utils.AppInfoParser] ...
- hive数据导入导出和常用操作
导出到本地文件 insert overwrite local directory '/home/hadoop'select * from test1; 导出到hdfs insert overwrite ...
- filzilla
之前找了一套支援 SFTP (FTP over SSH) 的 FTP Server 就是為了解決 Port 不夠用的問題,直到最近才發現我們常用的 FileZilla Server 原來就有支援 FT ...
- 使用amaze ui模板全过程
amaze ui基于gulp构建,所以现在安装gulp需要的环境,gulp使用npm安装,npm基于node.js 所以一切从node.js开始 1 下载对应的node.js 打开 https://n ...
- 1_Utilities__bandwidthTest
使用三种模式(QUICK_MODE,RANGE_MODE,SHMOO_MODE),测试三种拷贝情况下的显存带宽(HostToDevice,DeviceToHost,DeviceToDevice) ▶ ...
- leetcode476
public class Solution { public int FindComplement(int num) { //计算数字二进制的反码 var list = new List<int ...