UVa 1600 Patrol Robot(BFS)
Posted Neord
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1600 Patrol Robot(BFS)相关的知识,希望对你有一定的参考价值。
题意:
给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= 20)个障碍物, 求最短路径, 如无法到达输出 -1。
分析:
对于空地, 建一个vis数组记录走过的空地, 然后每次碰到没vis过的空地都把队伍K更新为最大值, vis这块地。
对于墙的情况, 我们可以建一个vis1数组去记录通过墙时候的k值, 如果之前有一个k值比现在要通过的大, 那么我们就不入队, 否则入队,入队k是队头k-1, 更新这堵墙的k值。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 25; 4 int G[maxn][maxn]; 5 int vis[maxn][maxn]; 6 int visk[maxn][maxn]; 7 int dx[] = {0,1,0,-1};//右下左上 8 int dy[] = {1,0,-1,0}; 9 struct node{ 10 int x,y, step, k; 11 node(int x, int y, int step, int k):x(x), y(y), step(step), k(k){} 12 }; 13 int n, m, k; 14 bool vaild(int x, int y){ 15 if(x < 0 || x >= n || y < 0 || y >= m) 16 return false; 17 return true; 18 } 19 int main(){ 20 21 int T; 22 scanf("%d", &T); 23 while(T--){ 24 memset(G,0,sizeof(G)); 25 memset(vis,0,sizeof(vis)); 26 memset(visk,0,sizeof(visk)); 27 scanf("%d %d", &n, &m); 28 scanf("%d", &k); 29 for(int i = 0; i < n; i++){ 30 for(int j = 0; j < m; j++){ 31 scanf("%d", &G[i][j]); 32 } 33 } 34 35 36 int ok = 0; 37 queue<node> q; 38 q.push(node(0,0,0,k)); 39 visk[0][0] = k; 40 vis[0][0] = 1; 41 int cnt = 0; 42 while(!q.empty()){ 43 node t = q.front(); q.pop(); 44 // printf("%d %d %d %d\n", t.x,t.y, t.step, t.k); 45 if(t.x == n-1 && t.y == m-1){ 46 printf("%d\n",t. step ); 47 ok = 1; 48 break; 49 } 50 for(int i = 0; i < 4; i++){ 51 int tx = t.x + dx[i]; 52 int ty = t.y + dy[i]; 53 if(vaild(tx,ty)){ 54 if(G[tx][ty] == 1){ 55 if( t.k - 1 >= 0 && visk[tx][ty] <= t.k - 1){ 56 // if(!vis[tx][ty]){ 57 q.push(node(tx,ty,t.step+1, t.k - 1)); 58 visk[tx][ty] = t.k - 1; 59 // vis[tx][ty] = 1; 60 // } 61 } 62 } 63 else { 64 if(!vis[tx][ty]){ 65 q.push(node(tx,ty,t.step+1,k)); 66 vis[tx][ty] = 1; 67 } 68 } 69 } 70 } 71 } 72 if(!ok) printf("-1\n"); 73 } 74 return 0; 75 }
以上是关于UVa 1600 Patrol Robot(BFS)的主要内容,如果未能解决你的问题,请参考以下文章