POJ_1376_bfs
题目描述:
给定一个黑白格子的图,黑格子是障碍物,一个线段交点的起点,一个线段交点的终点和初始方向,机器人从起点开始,只能沿着线段,走到终点,期间不能沿着障碍物边缘和墙边缘。
一次操作可以向当前方向走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的更多相关文章
随机推荐
- list绑定
/** * 首页信息查询的回调函数 * @param 返回值 */ M_Main.ajaxCallBack = function (data){ var dataSource = data.resiC ...
- Spring AOP 基于AspectJ
简介 AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式支持.因为Spring1.0的时候Aspectj还未出现; AspectJ1.5中新增了对 ...
- 异步-promise、async、await
下面代码打印结果是? setTimeout(()=>{ console.log(1) }) new Promise((resolve,reject)=>{ console.log(2) r ...
- Go 每日一库之 flag
缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态.写博客是一种方式,但不是每天都有想写的,值得写的东西. 有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏 ...
- CI框架获取post和get参数_CodeIgniter使用心得
请参考:CI文档的输入类部分: $this->input->post()$this->input->get() -------------------------------- ...
- how to render html tag
使用autoescaping If autoescaping is turned on in the environment, all output will automatically be esc ...
- Java BIO NIO 与 AIO
回顾 上一章我们介绍了操作系统层面的 IO 模型. 阻塞 IO 模型. 非阻塞 IO 模型. IO 复用模型. 信号驱动 IO 模型(用的不多,知道个概念就行). 异步 IO 模型. 并且介绍了 IO ...
- 使用wireshark 对flutter 框架APP进行抓包
引言 最近公司开发一个APP,由于原生人力不足,直接由前端使用flutter 开发的,而使用flutter框架开发的客户端 fiddler无法抓到包,所以我采用wireshark从路由层面抓包 fid ...
- 关于yarn安装,这里做一个备份
安装的是window版本,官网上有三种安装方式. 第一种下载一个.msi的安装包,然后当它运行时会指引你将 Yarn 安装到 Windows 上,因为点开以后页面是404,所以没有用这种方法. 第二种 ...
- Spring Boot2 系列教程 (五) | yaml 配置文件详解
自定义属性加载 首先构建 SpringBoot 项目,不会的看这篇旧文 使用 IDEA 构建 Spring Boot 工程. 首先在项目根目录 src >> resource >&g ...