uva1660_巡逻的机器人(状态bfs)



///////////////////////////////////////////////////////////////////////////////////////////////////////

作者:tt2767

声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0

查看本文更新与讨论请点击:http://blog.csdn.net/tt2767

链接被删请百度: CSDN tt2767

///////////////////////////////////////////////////////////////////////////////////////////////////////



题解:

建一个三维数组d[N][N][N] , 前两维是坐标,第三维是血条,它的意思就是当血条为hp时是否经过这点。用结构体记录步数,判断状态输出即可。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>

using namespace std;

const long double PI = acos(0.0) * 2.0;
const int N  = 30;
const int dx[] = {0,1,0,-1};
const int dy[] = {-1,0,1,0};

int n,m,k;
struct P
{
    int x,y,hp,cnt; //hp是血条,每次过障碍-1 ,cnt为当前步数
    P(int x = 0 , int y = 0,int hp = 0,int cnt = 0): x(x),y(y),hp(ph),cnt(cnt){}
};

int d[N][N][N]; //第三维为同过此坐标时的ph值
int G[N][N];

int bfs();

int main()
{
    int Case;
    scanf("%d",&Case);
    memset(G,-1,sizeof(G)); //记得重置地图
    while(Case--)
    {
        scanf("%d%d%d",&m,&n,&k); //k为血条最大值
        for(int i = 0 ; i <m  ; i++)
        {
            getchar(); //吸收‘\n’
            for(int j = 0 ; j < n ; j++)
                scanf("%d",&G[i][j]);
        }
        printf("%d\n",bfs());
    }
    return  0 ;
}

int bfs()
{
    memset(d,0,sizeof(d));
    P s(0,0,k,0) , g(m-1,n-1,k,0);
    d[0][0][k] = 1;
    queue<P> q;
    q.push(s);
    while(!q.empty())
    {
        P p = q.front(); q.pop();

        if(p.x == g.x &&p.y == g.y) return p.cnt;   //达到终点返回步数

        if(p.hp >= 0) //有血才能继续走
        {
            P tmp;
            for(int  i = 0 ; i< 4 ; i++)
            {
                tmp.x = p.x + dx[i];
                tmp.y = p.y + dy[i];
                tmp.hp = G[tmp.x][tmp.y] ? p.hp -1 : k ; //遇到0时恢复满血
                tmp.cnt = p.cnt + 1;

                if(0 <= tmp.x && tmp.x < m && 0<= tmp.y && tmp.y <= n && d[tmp.x][tmp.y][tmp.hp] == 0 && tmp.hp >=0)
                {
                    d[tmp.x][tmp.y][tmp.hp] = 1;
                    q.push(tmp);
                }
            }
        }
    }
    if(q.empty())    return -1; //没有到达终点
}

版权声明:本文为博主原创文章,允许非商业性转载,转载必须注名作者(CSDN tt2767)与本博客链接:http://blog.csdn.net/tt2767。

时间: 2024-10-04 04:28:33

uva1660_巡逻的机器人(状态bfs)的相关文章

UVA816 三状态BFS

UVA816 三状态BFS UVA816题目是一个标准的求最短路问题,但是多了一个朝向.也就是说不同的朝向进入一个节点,转换方向的方法各不相同.所以我们对于每个节点出了横纵坐标以外,还要多一个维度记录朝向.定义节点数组p[y][x][dir]记录(y,x)坐标,朝向为dir的节点的前继节点. #include<iostream>//不需要判断边界.移动方向已经确定 #include<cstdio> #include<cstring> #include<queue&

巡逻的机器人

 题意: 机器人要从一个m*n(1<=m,n<=20)网格的左上角(1,1)到右下角(m,n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往四个方向走一格,但不能连续穿越k个(0<=K<=20)障碍,求最短的长度.起点和终点保证是空地.如图:最短的长度是10. Input The input consists of several data sets. The first line of the input file contains the n

搜索(另类状态BFS):NOIP 华容道

描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白

BFS学习总结

BFS学习总结 给你一个n*m的网格迷宫,迷宫中有些格子不能走,其他的格子都能走.然后给你起点与终点,问你从起点走到终点最少需要多少步? 上面的问题就是一个典型的BFS问题,对于这类问题来说,只要你掌握了这类问题的关键思想,其实他们都是可以用类似的思路来做的. 你可以把BFS问题想象成:从一个父亲(起点状态)生儿子(后继状态),儿子又生孙子(后继状态)的过程,只要这个家族中出生了一个满意的后代(终点状态),这个家族就不生了. 但是如果这个家族中有两个完全一样的人出生(他们的辈分不一定相同),那么

Day1: T3 bfs T4 树形DP

T3:BFS 回看了一下Day1的T3...感觉裸裸的BFS,自己当时居然没有看出来... 同时用上升和下降两种状态bfs即可 这一题还要注意一个细节的地方,就是题目要求的是求往返的最优解 k=min(d[上升],d[下降]); ans=min(2*k+1,d1[]+d2[]); 输出ans..这个地方需要理解: 其余的照bfs模板打即可:

poj1753-Flip Game BFS+位运算

题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完成了.现在给定一个初始状态,要求输出能够完成游戏所需翻转的最小次数,如果初始状态已经达到要求输出0.如果不可能完成游戏,输出Impossible. 主要思想: 1.如果用一个4*4的数组存储每一种状态,不但存储空间很大,而且在穷举状态时也不方便记录.因为每一颗棋子都只有两种状态,所以可以用二进制0和

UESTC 485 Game(康托,BFS)

Today I want to introduce an interesting game to you. Like eight puzzle, it is a square board with 9 positions, but it filled by 9 numbered tiles. There is only one type of valid move, which is to rotate one row or column. That is, three tiles in a r

如何用MoveIt快速搭建机器人运动规划平台?

MoveIt = RobotGo,翻译成中文就是"机器人,走你!"所以,MoveIt的主要就是一款致力于让机器人能够自主运动及其相关技术的软件,它的所有模块都是围绕着运动规划的实现而设计的. 两个月前给自己挖了个坑,说要写写MoveIt,但一直没动手.主要有两个原因: 1)这两个月主要在写小论文,毕竟博士生要毕业还得看论文,不能靠公众号阅读量分享率: 2)直接讲MoveIt似乎需要挖更多坑,一直没想好怎么写比较好. 主要是因为机器人运动规划涉及太多基础内容,如果跳过不讲就会变成新坑:一

机器人视觉导航工作总结

1.SLAM技术 SLAM 全称 Simultaneous Localization and Mapping,中文名曰「同步定位与地图构建」,主要用于解决机器人在未知环境运动时的定位和地图构建问题.在SLAM理论中,第一个问题称为定位 (Localization),第二个称为建图 (Mapping),第三个则是随后的路径规划.SLAM的实现方式与难度和传感器密切相关.目前实现SLAM的传感器大体分为激光和视觉两大类.相比于图像,激光雷达可直接测量目标与传感器之间的相对位置,使得激光雷达SLAM技