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的更多相关文章
随机推荐
- 动态规划之抢劫问题-LT213
找到大问题和小问题之间共有的特性,列出一定的状态转移规律,然后设计满足条件的小问题解决方案,最后凭借记忆中的中间值快速求出最终解 动态规划问题的复杂性在于你永远不知道下一个题目中的状态是什么,有什么样 ...
- 天梯 L2 紧急救援 (dijkstra变形+记录路径)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- 基于Arduino的按键控制LED实验
I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功 ...
- C# 微信h5支付
相关文档 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 需要准备 公众号ID.商户号.商家私钥 1.登 ...
- Android学习进度一
在解决了电脑产生的一系列问题之后成功安装了Android Studio,并在其自带的手机模拟器上成功运行了第一个App(Hello World!),通过这个最简单的App研究了App基本的工程结构,为 ...
- 重拾c++第四天(7):函数相关
1.引用变量: int a; int &b = a; //引用变量 指向同一地址,必须在初始化时定义,且一直对原变量献上忠诚,主要针对类对象 2.函数重载最好用在功能相同,但数据类型不同的情况 ...
- 矩形内的递推dp
链接:https://www.nowcoder.com/acm/contest/130/B来源:牛客网 黑妹和黑弟又聚在一起玩游戏了,这次他们选择在一个n*m的棋盘上玩游戏,棋盘上的每个方格都有一个非 ...
- 前端笔记5-js1
一.在JS中一共有6种数据类型1. String 字符串2. Number 数值3. Boolean 布尔值4. Null 空值5. Undefined 未定义6. Object 对象 其中 Stri ...
- CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)
·栈.单调栈 1.栈的特点与基本操作 2.单调栈 单调栈是一种特殊的栈,其栈内的元素都保持一个单调性(单调递增或者递减). ·单调递增栈,从栈底到栈顶依次递增(单调非递减栈:允许有相等) ·单调递减栈 ...
- python模拟鼠标拖动操作的方法
本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧 ...