传送门: https://uva.onlinejudge.org/external/16/1600.pdf

多状态广搜

网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0,当前的k变成最初的k。

vis[x][y][z]  x, y代表坐标  z表示k  当为真时说明该点剩余穿墙次数为k的状态已出现过

 #include <bits/stdc++.h>
using namespace std; typedef struct Node{
int x, y, step, k;
} node;
const int MAXN = ;
const int INF = 0x3f3f3f3f;
const int cx[] = {-, , , };
const int cy[] = {, , -, };
int n, m, k, ans;
int maze[MAXN][MAXN];
int vis[MAXN][MAXN][MAXN]; void bfs(){
queue<node> q;
while(!q.empty()) q.pop();
node cur ;
cur.x = cur.y = ;
cur.step = ;
cur.k = k;
q.push(cur);
vis[cur.x][cur.y][cur.k] = ;
while(!q.empty()){
cur = q.front();
q.pop();
int x = cur.x, y = cur.y;
if(x == n && y == m){
ans = cur.step;
return ;
}
node now;
if(cur.k >= ){
for(int i = ; i < ; ++i){
now.x = x + cx[i], now.y = y + cy[i];
now.step = cur.step + ;
now.k = maze[now.x][now.y] ? cur.k - : k;
if(now.x < || n < now.x || now.y < || m < now.y || vis[now.x][now.y][now.k]) continue;
if(now.k >= ){
vis[now.x][now.y][now.k] = ;
q.push(now);
}
}
}
}
} int main(){
int t;
cin >> t;
while(t--){
cin >> n >> m >> k;
memset(vis, , sizeof(vis));
memset(maze, , sizeof(maze));
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
cin >> maze[i][j];
ans = -;
bfs();
cout << ans << endl;
}
return ;
}

UVa 1600 Patrol Robot (习题 6-5)的更多相关文章

  1. UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

    UVA 1600 Patrol Robot   Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   ...

  2. UVa 1600 Patrol Robot(三维广搜)

    A robot has to patrol around a rectangular area which is in a form of m x n grid (m rows and ncolumn ...

  3. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  4. UVA 1600 Patrol Robot

    带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...

  5. Uva 1600 Patrol Robot (BFS 最短路)

    这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...

  6. UVa 1600 Patrol Robot(BFS)

    题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...

  7. UVa 1600 Patrol Robot【BFS】

    题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0, ...

  8. UVA - 1600 Patrol Robot (巡逻机器人)(bfs)

    题意:从(1,1)走到(m,n),最多能连续穿越k个障碍,求最短路. 分析:obstacle队列记录当前点所穿越的障碍数,如果小于k可继续穿越障碍,否则不能,bfs即可. #pragma commen ...

  9. 【UVa】1600 Patrol Robot(dfs)

    题目 题目     分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T     代码 #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. session fixation

    转自:session fixation攻击 什么是session fixation攻击 Session fixation有人翻译成"Session完成攻击",实际上fixation ...

  2. oc底层方法调用流程

    1.对象方法保存到类对象里面,每个类对象中都有一个方法列表.类方法保存在元类中方法列表 a.通过isa指针去对应的类中查找: b.生成方法编号,根据方法编号查找对应的方法(找到只是最终实现地址,根据地 ...

  3. 【顶】在node环境下玩转less

    1.先搭建node.js环境 具体步骤请点我 2.运行node.js环境 唤出dos窗口→进入工程目录→输入 →成功运行 3.关于less

  4. CentOS部署yum本地源和共享

    约定yum本地源的机器IP为192.168.1.100,需要访问共享源的IP为192.168.1.101 关闭并禁止selinux和firewalld 创建本地源 1.上传centos7光盘镜像到指定 ...

  5. SVN版本控制的使用

    下面说一说本人对SVN工具使用的理解: SVN就是一个工具,一个用来便于多人(或说团队)开发代码的版本控制工具,我们可以用它很好的把多个程序员开发出来的代码统一起来,并且保证在这个工程中不出现任何差错 ...

  6. phonegap 随笔

    开发者论坛 http://bbs.phonegapcn.com/forum.php phone调用android本地方法 http://blog.csdn.net/crazyman2010/artic ...

  7. Objective-C Runtime 运行时之六:拾遗(转载)

    前面几篇基本介绍了runtime中的大部分功能,包括对类与对象.成员变量与属性.方法与消息.分类与协议的处理.runtime大部分的功能都是围绕这几点来实现的. 本章的内容并不算重点,主要针对前文中对 ...

  8. Beego学习笔记——开始

    beego简介 beego是一个快速开发Go应用的http框架,他可以用来快速开发API.Web.后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado.sinatra.fl ...

  9. 6.MyBaits的分页和缓存查询

    1. 创建javaweb项目MyBaits_Page_CaChe 2.在项目的WebRoot下的WEB-INF下的lib文件下加入jar文件 log4j-1.2.17.jar mybatis-3.2. ...

  10. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题十二 HDU 1176 免费馅饼

    题意: 中文题意不解释…… 思路: 先把x,T存到矩阵里 然后像数塔一样从最底层走一边就行了 dp[i][j]代表在时间为j时 第i个位置最多能吃到多少个馅饼 最后输出第0时刻的5位置的馅饼数量就好了 ...