题目描述:

  给定一个黑白格子的图,黑格子是障碍物,一个线段交点的起点,一个线段交点的终点和初始方向,机器人从起点开始,只能沿着线段,走到终点,期间不能沿着障碍物边缘和墙边缘。

  一次操作可以向当前方向走1-3步或者向左右转身,求最小步数。

思路:

  由于格子和机器人的线路形式不一样,直接把障碍物转化成不能走的线路,刚开始想dfs,后来发现没法做,只能bfs(凭自己的水平- _ -),记录每次的坐标、方向和操作次数,每个坐标第一次到达的时候必然是次数最少的。另外要注意的是,转头只能左右转,不能向后转,前进的的时候,若当前前进的步数会遇到障碍物,则比这个步数大的步数也必然会遇到障碍物。

  一开始提交的时候,以为可以经过边界,一时WA,然后参考了网上代码之后,修改了这个细节就AC了= =。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std; int a[][],vis[][][],move[][]= {{-,},{,-},{,},{,}}; struct robot{
int x,y,dir,num;
}start,stop; int main()
{ int n,m;
char s[];
while(~scanf("%d%d",&n,&m) && n &&m)
{
memset(a,,sizeof(a));
memset(vis,,sizeof(vis));
int ans = -;
for(int i = ;i <= n;i++)
{
for(int j = ;j <= m;j++)
{
int temp;
scanf("%d",&temp);
if(temp)
{
a[i][j] = ;
a[i+][j] = ;
a[i][j+] = ;
a[i+][j+] = ;
}
}
}
n++;
m++; scanf("%d%d%d%d%s",&start.x,&start.y,&stop.x,&stop.y,s);
start.x++;
start.y++;
stop.x++;
stop.y++;
switch(s[])
{
case 'n': start.dir = ;break;
case 's': start.dir = ;break;
case 'w': start.dir = ;break;
case 'e': start.dir = ;break;
}
queue<robot> q;
start.num = ;
q.push(start);
while(!q.empty())
{
robot now = q.front();
q.pop();
int xx = now.x,yy = now.y,dirr = now.dir,numm = now.num;
if(xx == stop.x && yy == stop.y)
{
ans = numm;
printf("%d\n",ans);
break;
}
if(xx <= || xx >= n || yy <= || yy >= m || vis[xx][yy][dirr] || a[xx][yy])
{
continue;
}
for(int i =;i <= ;i++)
{
if(i-dirr == || i-dirr == || i- dirr ==-)
{
continue;
}
else
{
robot temp;
temp.x = xx;
temp.y = yy;
temp.dir = i;
temp.num = numm+;
q.push(temp);
}
}
for(int i = ;i <= ;i++)
{
int xxx = xx+move[dirr][]*i,yyy = yy+move[dirr][]*i;
if (a[xxx][yyy] == )
{
break;
}
robot temp;
temp.x = xxx;
temp.y = yyy;
temp.dir = dirr;
temp.num = numm+;
q.push(temp);
}
vis[xx][yy][dirr] = ;
}
if(ans == -) printf("-1\n");
}
return ;
}

POJ_1376_bfs的更多相关文章

随机推荐

  1. 16.用pycharm导入自己写的模块时,import无法识别的解决办法

    我们用pycharm打开自己写的代码,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的文件,但是我们写的文件又确实在同一个文件夹中, 这种问题可以用下面的方法解决: 1)打开File ...

  2. Java面向对象之异常【一】

    目录 Java面向对象之异常[一] 异常的继承体系 Error Exception 异常是否受检 unchecked exceptions(不受检异常) checked exceptions(受检异常 ...

  3. SpringBoot系列之集成Dubbo的方式

    SpringBoot系列之集成Dubbo的方式 本博客介绍Springboot框架集成Dubbo实现微服务的3种常用方式,对于Dubbo知识不是很熟悉的,请先学习我上一篇博客:SpringBoot系列 ...

  4. Java8 新特性(一)- Lambda 表达式

    2014年3月18日发布了JavaSE 8 不追求技术的新,追求技术的稳定 本质:Lambda 表达式是一个匿名函数 作用:简化代码,增强代码的表达力 Lambda 语法格式 // 格式1:无参无返回 ...

  5. 构造函数以及关键词this

    Java中所有类都有构造方法,用来进行该类对象的初始化,构造方法也有名称,参数和方法体以及访问权限的设定. 1.构造方法的完整定义格式如下: [public|protected|private]< ...

  6. 理解 SQL 开窗函数

    一次面试被问到开窗函数,懵逼了,赶紧补补总结一下.... 开窗函数也是函数,所以 比如在原来的查询上添加一个总数列 create table ztest( id int identity, c1 in ...

  7. 从头学pytorch(二十):残差网络resnet

    残差网络ResNet resnet是何凯明大神在2015年提出的.并且获得了当年的ImageNet比赛的冠军. 残差网络具有里程碑的意义,为以后的网络设计提出了一个新的思路. googlenet的思路 ...

  8. vue 项目路由跳转后显示不同的title

    1.在router/index.js的每个路由中配置title 2.在项目中运行命令 npm install vue-wechat-title --save 安装插件(在 package.json文件 ...

  9. css文字溢出显示省略号

    1.单行文字溢出显示省略号. overflow: hidden; text-overflow: ellipsis; white-space: nowrap;//文本不换行 2.多行文本溢出显示省略号. ...

  10. Heroku学习 - 利用Heroku app实现 OrgA 查询Org B 的数据数据

    最近研究了一番如何通过Heroku应用对OrgA开放一个接口,参数传递的是一个SQL,APP的负责将SQL通过callout的形式调用目标OrgB Rest API来获取数据并返回给OrgA.我是用的 ...