UVa 1600 Patrol Robot (习题 6-5)

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

多状态广搜

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

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

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef struct Node{
 5     int x, y, step, k;
 6 } node;
 7 const int MAXN = 25;
 8 const int INF = 0x3f3f3f3f;
 9 const int cx[] = {-1, 1, 0, 0};
10 const int cy[] = {0, 0, -1, 1};
11 int n, m, k, ans;
12 int maze[MAXN][MAXN];
13 int vis[MAXN][MAXN][MAXN];
14
15 void bfs(){
16     queue<node> q;
17     while(!q.empty()) q.pop();
18     node cur ;
19     cur.x = cur.y = 1;
20     cur.step = 0;
21     cur.k = k;
22     q.push(cur);
23     vis[cur.x][cur.y][cur.k] = 1;
24     while(!q.empty()){
25         cur = q.front();
26         q.pop();
27         int x = cur.x, y = cur.y;
28         if(x == n && y == m){
29             ans = cur.step;
30             return ;
31         }
32         node now;
33         if(cur.k >= 0){
34             for(int i = 0; i < 4; ++i){
35                 now.x = x + cx[i], now.y = y + cy[i];
36                 now.step = cur.step + 1;
37                 now.k = maze[now.x][now.y] ? cur.k - 1 : k;
38                 if(now.x < 1 || n < now.x || now.y < 1 || m < now.y || vis[now.x][now.y][now.k]) continue;
39                 if(now.k >= 0){
40                     vis[now.x][now.y][now.k] = 1;
41                     q.push(now);
42                 }
43             }
44         }
45     }
46 }
47
48 int main(){
49     int t;
50     cin >> t;
51     while(t--){
52         cin >> n >> m >> k;
53         memset(vis, 0, sizeof(vis));
54         memset(maze, 0, sizeof(maze));
55         for(int i = 1; i <= n; ++i)
56             for(int j = 1; j <= m; ++j)
57                 cin >> maze[i][j];
58         ans = -1;
59         bfs();
60         cout << ans << endl;
61     }
62     return 0;
63 }
时间: 2024-09-26 23:39:05

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

UVA 1600 Patrol Robot

带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 30 ; 8 9 struct node { 10 int x,y; 11 int

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

UVA 1600 Patrol Robot Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The colu

UVA 1600 Patrol Robot(BFS扩展)

Patrol Robot Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m.

UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS) 解题心得

原题: Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The columns are labeled from 1 to n. A cell (i, j) denotes the cell in row i and column j in the

Uva 1600 Patrol Robot (BFS 最短路/DFS剪枝)

这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #include <bits/stdc++.h> using namespace std; struct Node{ int r; int c; int g; int cnt; Node(int r,int c,int g,int cnt):r(r),c(c),g(g),cnt(cnt){} }; int v

UVa 1600 Patrol Robot(BFS)

题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= 20)个障碍物, 求最短路径, 如无法到达输出 -1. 分析:   对于空地, 建一个vis数组记录走过的空地, 然后每次碰到没vis过的空地都把队伍K更新为最大值, vis这块地. 对于墙的情况, 我们可以建一个vis1数组去记录通过墙时候的k值, 如果之前有一个k值比现在要通过的大, 那么我们就不入队,

【UVa】1600 Patrol Robot(dfs)

题目 题目 ? ? 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=1<<25; int k,n,m,map[25][25],dx[10]={1,-1,0,0},dy[10]={0,0,1,-1},ans; int vis[25][25][25];

UVA 1600 Patrol Robert

非常适合A*的一道题. 比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量. #include<cstdio> #include<cstring> #include<queue> using namespace std; const int MAX = 21; int m,n,k; int C[MAX][MAX][MAX]; int G[MAX][MAX]; int tarx,tary; struct node { int g,h; int x,y;//对于本题 x

1600 - Patrol Robot(BFS)

BFS题,不过多了一个很有意思的条件:不能连续穿越K个障碍,就好像多了一个技能一样,我用pre[][]数组来记录目前的k值: #include<bits/stdc++.h> using namespace std; int a[30][30],T,m,n,k,d[30][30],pre[30][30],air[10]={1,0,-1,0},air2[10]={0,1,0,-1};; typedef pair<int,int> P; P s[450]; int bfs() { que