题意:
      给你一个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. [HDU] 2612 Find a way - 用单源最短论经模拟的简单广搜

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2612 方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然 ...

  2. [kuangbin] M - Find a way(简单广搜)

    题目链接:https://vjudge.net/contest/215603#problem/M 其中三维数组dis将两个广搜合并到了一起 #include<iostream> #incl ...

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

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

  4. Catch That Cow——广搜

    Catch That Cow Problem Description Farmer John has been informed of the location of a fugitive cow a ...

  5. [HDU] 1181 变形课-简单建模后广搜

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1181 方法:以所有咒语看做一条起点为首字母,终点为末字母的有向边来建立有向图.然后在图中判断目标路径 ...

  6. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  7. 简单深搜广搜基本模板

    简单搜索 DFS: 剪枝,条件 容易超时,超时后基本就是剪枝的问题/无限递归?,或者用广搜试试? 模板(自己的理解) int n,m;//一般输入的行列数/边界 int mov[4][2] = {1, ...

  8. 专题一:简单搜索、深搜、广搜

    挑战程序设计竞赛(课后题难题汇总) 1. AOJ 0033 Ball(贪心) #include<cstdio> #include<algorithm> using namesp ...

  9. 二叉树的深搜(DFS)与广搜(BFS)

    转载自: https://blog.csdn.net/u011613367/article/details/50950408 数据结构中的有两个比较重要的算法.深度优先搜索和广度优先搜索. 二叉树中的 ...

最新文章

  1. Fragment要点复习
  2. BZOJ 3991: [SDOI2015]寻宝游戏
  3. 贝叶斯优化python包_Bayesian2D-用贝叶斯优化方法求任意二维函数的最大值或最小值的软件包-Juhan Raidal...
  4. Linux命令基础3
  5. linux为已有磁盘扩容 kvm,KVM虚拟磁盘扩容
  6. 怎么样才能学好java_单人拉丁舞应该怎么样才能学好?初学者需要做到的4点要求...
  7. 【Java】_2_Java程序入门第五课
  8. matlab求单自由度振动方程为,matlab求解振动方程
  9. 视频教程-【深入理解计算机网络】讲师解读计算机网络原理视频课程(下)-计算机网络
  10. 雪球网 存入mysql
  11. Java *1.11(人口估算)美国人口调查局基于以下假设进行人口估算:
  12. 力扣周赛 第282场 Java题解
  13. 微软云搭建服务器,快速入门:创建服务器 - Azure 门户 - Azure Database for PostgreSQL - 单个服务器 | Microsoft Docs...
  14. python自定义函数实例 lite_python 函数小实例
  15. Win Mac JDK安装教程
  16. 解析JSON通用工具类
  17. linux uniq去重不生效
  18. american主板网卡灯关机后还亮_玩游戏电脑自己关机。主机灯一闪一闪的。显示器黑屏。键盘鼠标不亮。切短电源才不亮、求大神帮忙看看、、...
  19. java程序求内切圆_java 求三角形的内切圆,外接圆
  20. 华硕ASUS Eeebook X205TA上网本系统重装

热门文章

  1. Nginx的https设置
  2. some language grammars
  3. Tomcat创建一个windows服务
  4. hadoop入门学习系列之三mysq+php+mysqladmin安装
  5. ASP.NET 获取客户端IP (无视代理)
  6. [转帖]爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
  7. POJ3335(半平面交)
  8. Lintcode 167. 链表求和 221. 链表求和 II 题解
  9. as用百度地图不联网就gg
  10. 模态框在IE下的问题,即position:fixed在IE下不兼容的处理方式