题目链接: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)的更多相关文章

  1. 洛谷P1126机器人搬重物[BFS]

    题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...

  2. 机器人搬重物(BFS)

    机器人搬重物 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 10[提交][状态][讨论版] 题目描述 机 器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一 ...

  3. 洛谷P1126 机器人搬重物

    洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...

  4. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  5. P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  6. 洛谷——P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  7. 洛谷P1126 机器人搬重物【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...

  8. 洛谷 P1126 机器人搬重物 (BFS)

    题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...

  9. 【洛谷P1126】机器人搬重物

    题目大意:给定一个 N 行,M 列的地图,一个直径为 1.6 的圆形机器人需要从起点走到终点,每秒钟可以实现:向左转,向右转,向前 1-3 步.求从起点到终点最少要多长时间. 题解:相比于普通的走迷宫 ...

随机推荐

  1. linux修改文件系统挂载的目录

    比如想把已经挂载在home目录上的硬盘挂载到data目录上, 如下操作 #df -h(查看分区情况及数据盘名称) # mkdir /data(如果没有data目录就创建,否则此步跳过) # umoun ...

  2. js代码的执行顺序及运算

    代码执行顺序:从上往下,一行一行的执行(也叫一个模块一个模块的执行) 变量的提升(它不是变量的功能,而是浏览器的功能) js代码如何执行? js代码执行前,浏览器会给他一个全局的环境 叫window, ...

  3. 远程复制文件scp使用

    1. install sudo apt-get install openssh-client openssh-server 2. login ssh remoteuser@remoteIP 3. co ...

  4. SpringMVC整合Hessian访问远程服务

    1.1     Hessian简介       Hessian是一个轻量级的Web服务实现工具,它采用的是二进制协议,因此很适合发送二进制数据.它的一个基本原理就是把远程服务对象以二进制的方式进行发送 ...

  5. 最近比赛中遇到的几道dp题

    1.2015 icpc 长春-H-Partial Tree(据说是完全背包,但我觉得不像) 一.题意 给定$n$个点,每一个点$i$的权值为关于度数$d_i$的函数$f(d_i),$让你构建一棵树,使 ...

  6. Ubuntu14.04下codeblocks手动编译配置bost_1_57_0

    环境:ubuntu 14.04  32bit,boost_1_57_0 前期准备:boost中,用到了别的函数库,所以为了使用boost中相应的功能,需要先安装系统中可能缺失的库 apt-get in ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE

    HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...

  8. mysql更新(四) 数据类型

    07-数据类型   介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/m ...

  9. mysql 数据字典

    Information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式. desc tb_name ,describe tb_name,show columns from tb_ ...

  10. jpa-入门.缓存配置ehcache.xml

    <ehcache> <!-- Sets the path to the directory where cache .data files are created. If the p ...