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的更多相关文章
随机推荐
- JavaScript面向对象 实例与原型
JavaScript 面向对象 和 C# 不太一样,js 的对象是继承自原型的如下: 首先创建一个 js 实例 new function function f () {} 这个函数 会继承 Func ...
- python条件判断语句
# 条件判断(if)语句: # 语法1: if 条件表达式 : 单行语句 # 语法2: if 条件表达式 : # 代码块(多行语句) # 执行的流程:if语句在执行时,会先对条件表达式进行求值判断, ...
- Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...
- cogs 293. [NOI 2000] 单词查找树 Trie树字典树
293. [NOI 2000] 单词查找树 ★★☆ 输入文件:trie.in 输出文件:trie.out 简单对比时间限制:1 s 内存限制:128 MB 在进行文法分析的时候,通常需 ...
- Linux删除文件 清除缓存
相信很多测试 经常会经历开发叫你清除缓存这种事. 那我们要怎么清呢? 一.首先,确认你要清除的缓存在哪个目录下,然后切换到该目录下,比如 我现在知道我的的缓存目录是在newerp这个目录下,则如图 二 ...
- dfs - 概率
C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- Adobe Acrobat DC 安装
Adobe Acrobat DC 制作pdf模板 下载:http://www.downza.cn/soft/20562.html 安装出错解决: 可以将C:\Program Files (x86)\C ...
- idea 2019.3 最新版破解教程
背景 最近,idea又被整治了,所以一大批激活码都失效了.我之前已经有2018版的永久激活了,所以非常淡定~,也没打算升级版本.但是,最近发现周围的人都在讨论这个问题.于是,我也找到了2019.3最新 ...
- Redis(二):redis命令构建及关键属性解析
上一篇文章,我们从框架层面,主要介绍了redis的启动过程,以及主要的命令处理流程逻辑.这些更多的都是些差不多的道理,而要细了解redis,则需要更细节的东西. 今天我们稍微内围的角度,来看看几个命令 ...
- minikube 设置CPU和内存
安装minikube之后,第一次sudo minikube start 时,设置参数--cpus int --memory int . 如果需要更改设置,需要将缓存文件$HOME/.minikube ...