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的更多相关文章
随机推荐
- SpringBoot 总结篇
时至今日,SpringBoot 系列文章也算是告一段落,回想起当初立flag的情景,仿佛还历历在目.用一个月时间学完 SpringBoot 并整理成文章?又定一些异想天开计划,当时这样 ...
- 拥有 GitHub 开源项目的小伙伴,免费申请 JetBrains 全家桶的全流程详解
工欲善其事,必先利其器.如果您想要学习 Java.PHP.Ruby.Python.JavaScript.Objective-C..NET 中的任何一种开发技术,国际知名且屡获殊荣的 JetBrains ...
- 【Java基础总结】IO流
字节流 1. InputStream 字节输入流 代码演示 InputStream in = System.in; System.out.println("int read(byte b) ...
- JAVA封装、继承、多态
封装 1.概念: 将类的某些信息隐藏在类的内部,不允许外部程序访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: a.只能通过规定的方法访问数据 b.隐藏类的实例细节,方便修改和实 ...
- nor flash之擦除和写入
最近研究了下nor flash的掉电问题,对nor的掉电有了更多的认识.总结分享如下 擦除从0变1,写入从1变0 nor flash的物理特性是,写入之前需要先进行擦除.擦除后数据为全0xFF,此时写 ...
- 【Tool】---ubuntu18.04配置oh-my-zsh工具
作为Linux忠实用户,应该没有人不知道bash shell工具了吧,其实除了bash还有许多其他的工具,zsh就是一款很好得选择,基于zsh shell得基础之上,oh-my-zsh工具更是超级利器 ...
- 【C_Language】---C文件学习
---恢复内容开始--- 又看了一遍文件的知识点了,断断续续已经看了2-3遍,也就这次花了点时间做了一下总结,以后我想都不会再去翻书了,哈哈. 1. 基于缓冲区的文件操作2. 打开关闭文件3. 单个字 ...
- 安装mysql8.0.17指南
1.首先,下载社区版mysql(下载地址https://dev.mysql.com/downloads/mysql/) 2.下载之后,将文件解压到自己想要安装的目录(如,本人将解压文件放置g://my ...
- 机器学习-K最近邻算法
一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...
- 个人第4次作业:Alpha测试
这个作业属于哪个课程 课程 这个作业要求在哪里 作业要求 团队名称 CTRL-IKun 一.测试人员个人信息 姓名 王川 学号 201731021132 所在团队 CTRL-IKun 二.测试情况及结 ...