题意:

      给你一个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简单广搜的更多相关文章

  1. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

  2. hdu 2612(Find a way)(简单广搜)

    Find a way Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  3. (简单广搜) Ice Cave -- codeforces -- 540C

    http://codeforces.com/problemset/problem/540/C You play a computer game. Your character stands on so ...

  4. 简单广搜,迷宫问题(POJ3984)

    题目链接:http://poj.org/problem?id=3984 解题报告: 1.设置node结构体,成员pre记录该点的前驱. 2.递归输出: void print(int i) { ) { ...

  5. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  6. hdu 2612:Find a way(经典BFS广搜题)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. HDU 1253 (简单三维广搜) 胜利大逃亡

    奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 //#define LOCAL #include <ios ...

  8. POJ 2251 Dungeon Master(广搜,三维,简单)

    题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...

  9. poj 3278 Catch That Cow (广搜,简单)

    题目 以前做过,所以现在觉得很简单,需要剪枝,注意广搜的特性: 另外题目中,当人在牛的前方时,人只能后退. #define _CRT_SECURE_NO_WARNINGS //这是非一般的最短路,所以 ...

随机推荐

  1. 原生js日历选择器,学习js面向对象开发日历插件

    在web开发过程中经常会碰到需要选择日期的功能,一般的操作都是在文本框点击,然后弹出日历选择框,直接选择日期就可以在文本框显示选择的日期.开发好之后给用户使用是很方便,但如果每一个日历选择器都要临时开 ...

  2. Java 读取Word文本框中的文本/图片/表格

    Word可插入文本框,文本框中可嵌入文本.图片.表格等内容.对文档中的已有文本框,也可以读取其中的内容.本文以Java程序代码来展示如何读取文本框,包括读取文本框中的文本.图片以及表格等. [程序环境 ...

  3. Java基础 随笔整理

    Java基础随笔整理 为了方便阅读,特整理了相关的学习笔记 Java感想 操千曲而后晓声 Java入门 Java其他 Java虚拟机详解 语言入门百题 Java开发工具 · Eclipse Java语 ...

  4. docker搭建redis集群和Sentinel,实现故障转移

    0.引言 公司开发需要用到redis,虽然有运维自动搭建,还是记录下如何搭建redis集群和Sentinel. 采用的是vagrant虚拟机+docker的方式进行搭建. 搭建思路: 首先是借鉴下其他 ...

  5. mongoDB服务器连接不上Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException:

    一大早打开node项目就报错,终端报 UnhandledPromiseRejectionWarning: MongooseServerSelectionError: connect ECONNREFU ...

  6. rest framework parsers

    解析器 机交互的Web服务更倾向于使用结构化的格式比发送数据格式编码的,因为他们发送比简单的形式更复杂的数据 -马尔科姆Tredinnick,Django开发组 REST框架包含许多内置的解析器类,允 ...

  7. 动态规划-最长公共上升子序列-n^2解法

    1. 题目描述 给定两个数列\(A, B\),如果他们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列.求\(A\)和\(B\)的最长公共上升子序列. 输入格 ...

  8. 【vscode】【python】自定义代码自动补全

    引自:https://blog.csdn.net/Kyrielong/article/details/88058884 { "python.jediEnabled": true, ...

  9. java网络通信不止UDP,TCP

    预备知识 多线程 实现多线程 线程池 IO流 核心功能就是读和写 扩展功能对什么读写,怎么读写,如何优化读写 网络基础 IP IP规定网络上所有的设备都必须有一个独一无二的IP地址,就好比是邮件上都必 ...

  10. 阿里一面CyclicBarrier和CountDownLatch的区别是啥

    引言 前面一篇文章我们<Java高并发编程基础三大利器之CountDownLatch>它有一个缺点,就是它的计数器只能够使用一次,也就是说当计数器(state)减到为 0的时候,如果 再有 ...