POJ1376简单广搜
题意:
给你一个n*m的矩阵,然后给你机器人的起点和终点,还有起点的方向,然后每次机器人有两种操作,左右旋转90度,或者是朝着原来的方向走1,2或者3步,机器人再走的过程中不能碰到格子,也不能碰到边界,输出最少步数。
思路:
比较简单的题目,只是要注意几点。
(1)走的过程中边界不可以碰
(2)如果你想一下子走3步的话,记住路程中不能碰墙
(3)mark的时候记得也罢方向mark上。
简单题目,就说这么多吧。
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
int x ,y ,t ,dir;
}NODE;
int sx ,sy ,ex ,ey ,n ,m ,sdir;
int mark[55][55][5];
int map[55][55];
NODE xin ,tou;
bool jude2(int x ,int y)
{
return !map[x+1][y] && !map[x][y+1] && !map[x+1][y+1];
}
bool ok(int x ,int y ,int dir)
{
return x >= 1 && x <= n && y >= 1 && y <= m && !map[x][y] && !mark[x][y][dir] && jude2(x ,y);
}
int BFS()
{
queue<NODE>q;
memset(mark ,0 ,sizeof(mark));
xin.x = sx ,xin.y = sy ,xin.t = 0 ,xin.dir = sdir;
mark[sx][sy][sdir] = 1;
q.push(xin);
while(!q.empty())
{
tou = q.front();
q.pop();
if(tou.x == ex && tou.y == ey) return tou.t;
//lift
xin = tou;
xin.t ++ ,xin.dir ++;
if(xin.dir == 5) xin.dir = 1;
if(ok(xin.x ,xin.y ,xin.dir))
{
mark[xin.x][xin.y][xin.dir] = 1;
q.push(xin);
}
//right
xin = tou;
xin.t ++ ,xin.dir --;
if(xin.dir == 0) xin.dir = 4;
if(ok(xin.x ,xin.y ,xin.dir))
{
mark[xin.x][xin.y][xin.dir] = 1;
q.push(xin);
}
for(int i = 1 ;i <= 3 ;i ++)
{
xin = tou;
xin.t ++;
int mk = 0;
if(tou.dir == 1)
{
xin.x -= i;
for(int j = xin.x + 1;j < tou.x ;j ++)
if(map[j][xin.y] || map[j][xin.y+1])
mk = 1;
}
if(tou.dir == 3)
{
xin.x += i;
for(int j = tou.x + 1;j < xin.x ;j ++)
if(map[j][xin.y] || map[j][xin.y+1])
mk = 1;
}
if(tou.dir == 2)
{
xin.y += i;
for(int j = tou.y + 1 ;j < xin.y ;j ++)
if(map[xin.x][j] || map[xin.x+1][j]) mk = 1;
}
if(tou.dir == 4)
{
xin.y -= i;
for(int j = xin.y + 1 ;j < tou.y ;j ++)
if(map[xin.x][j] || map[xin.x+1][j]) mk = 1;
}
if(!mk && ok(xin.x ,xin.y ,xin.dir))
{
mark[xin.x][xin.y][xin.dir] = 1;
q.push(xin);
}
}
}
return -1;
}
int main ()
{
char str[10];
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
memset(map ,255 ,sizeof(map));
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= m ;j ++)
scanf("%d" ,&map[i][j]);
scanf("%d %d %d %d" ,&sx ,&sy ,&ex ,&ey);
scanf("%s" ,str);
if(str[0] == 'n') sdir = 1;
else if(str[0] == 'e') sdir = 2;
else if(str[0] == 's') sdir = 3;
else sdir = 4;
printf("%d\n" ,BFS());
}
return 0;
}
POJ1376简单广搜的更多相关文章
- POJ 3126 Prime Path 简单广搜(BFS)
题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...
- hdu 2612(Find a way)(简单广搜)
Find a way Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- (简单广搜) Ice Cave -- codeforces -- 540C
http://codeforces.com/problemset/problem/540/C You play a computer game. Your character stands on so ...
- 简单广搜,迷宫问题(POJ3984)
题目链接:http://poj.org/problem?id=3984 解题报告: 1.设置node结构体,成员pre记录该点的前驱. 2.递归输出: void print(int i) { ) { ...
- poj 3278:Catch That Cow(简单一维广搜)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
- hdu 2612:Find a way(经典BFS广搜题)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 1253 (简单三维广搜) 胜利大逃亡
奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 //#define LOCAL #include <ios ...
- POJ 2251 Dungeon Master(广搜,三维,简单)
题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...
- poj 3278 Catch That Cow (广搜,简单)
题目 以前做过,所以现在觉得很简单,需要剪枝,注意广搜的特性: 另外题目中,当人在牛的前方时,人只能后退. #define _CRT_SECURE_NO_WARNINGS //这是非一般的最短路,所以 ...
随机推荐
- [数据结构与算法-13]ST表
ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...
- 任务队列 与 Celery概述
一.任务队列(Task Queues) 1.1 什么是任务队列? 任务队列用于管理后台工作,通常这些后台工作必须在 HTTP请求-响应循环 之外执行. 1.2 为什么需要任务队列? 对于那些不是由客户 ...
- 分布式session实现方式
一.背景 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理. 如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,N ...
- NumPy 将停止支持 Python 2
NumPy 项目宣布将停止支持 Python 2.Python 核心团队已经决定在 2020 年停止支持 Python 2,而 NumPy 项目自 2010 年以来同时支持 Python 2 和 Py ...
- 【H264】视频编码发展简史
一.常见视频编码格式 编码格式有很多,如下图: 目前比较常用的编码有: H26x系列:由ITU(国际电传视讯联盟)主导,侧重网络传输 MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象 ...
- 【PAT甲级】1119 Pre- and Post-order Traversals(前序后序转中序)
[题目链接] [题意] 根据二叉树的前序和后序序列,如果中序序列唯一,输出Yes,如果不唯一输出No,并输出这个中序序列. [题解] 众所周知,二叉树是不能够根据前序和中序建立的,为什么呢?首先需要明 ...
- Hi3559AV100 NNIE开发(6)RFCN中NNIE实现关键线程函数->SAMPLE_SVP_NNIE_Rfcn_ViToVo()进行数据流分析
前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...
- SDK音频测试流程
概述 在上篇文章中,给小伙伴们讲述了sdk模板在渲染中的流程,我们简单来回顾一下,主要讲述了数据创建.素材替换.音频.文字等四部分,在上次讲述中也因为时间于原因没有特别仔细的去讲述他们.上次我们说到最 ...
- JAVA题目:正整数n若是其平方数的尾部,则称n为同构数 如:5*5=25, 25*25=625 问: 求1~99中的所有同构数
1 /*题目:正整数n若是其平方数的尾部,则称n为同构数 2 如:5*5=25, 25*25=625 3 问: 求1~99中的所有同构数 4 */ 5 //分析:将1-99分为1-9和10-99,用取 ...
- 代码安全丨第二期:URL重定向(跳转)漏洞
URL重定向: URL重定向(URLredirection)漏洞,又称跳转漏洞,指的是网络应用程序接受用户可控的输入作为到外部站点的链接,然后在重定向中使用该链接.该安全漏洞给网络钓鱼攻击提供了极大的 ...