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+y 越大距离终点越近
   int k;
   bool operator < (const node& rhs) const{
      if(g + h > rhs.g + rhs.h) return true;
      if(g + h < rhs.h + rhs.g ) return false;
      if(g > rhs.g) return true;
      if(g < rhs.g) return false;
      return k > rhs.k;
   }
   void H(){
      h = tarx - x+ tary - y;
   }
};

node start;

#define C(n) C[n.x][n.y][n.k]
#define add(n) C(n) = true
int dx[] = { 0, 1, 0,-1};
int dy[] = { 1, 0,-1, 0};

int bfs()
{
   priority_queue<node> q;
   memset(C,false,sizeof(C));
   q.push(start); add(start);
   node cur,nxt;
   int i,nx,ny,nk;
   while(q.size()){
      cur = q.top();q.pop();
      if(cur.x == tarx && cur.y == tary) return cur.g;
      for(i = 0; i < 4; i++){
         nx = cur.x + dx[i];
         ny = cur.y + dy[i];
         if(nx >= m || nx < 0 || ny >= n || ny < 0 )continue;
         nk = G[nx][ny] ? cur.k+1 : 0;
         if(C[nx][ny][nk] || nk > k) continue;
         nxt.x = nx ; nxt.y = ny; nxt.g = cur.g+1 ; nxt.k = nk ; nxt.H();
         q.push(nxt); add(nxt);
      }
   }
   return -1;
}

int main()
{
  // freopen("in.txt","r",stdin);
   int T;
   int i,j;
   scanf("%d",&T);
   while(T--){
      scanf("%d%d%d",&m,&n,&k);
      for(i = 0;i < m; i++)
         for(j = 0;j < n; j++)
           scanf("%d",G[i]+j);
      tarx = m-1;tary = n-1;
      start.x = start.y = start.g = start.k = 0;
      //start.H();
      printf("%d\n",bfs());
   }
   return 0;
}
时间: 2024-12-24 14:53:48

UVA 1600 Patrol Robert的相关文章

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 (习题 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

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值比现在要通过的大, 那么我们就不入队,

Patrol Robot UVA - 1600

题意:给一个矩阵,从(1,1)走到(m,n)的最短路,"1"是障碍,不能连续穿过k个障碍. WA了16次,花费了一个上午和半个下午...想?? 每个点的属性至少是3维,比如每个点带有的已经连续穿过障碍的次数,再把跑过的步长算上,就四维了,所以最好用一个结构体! AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5

【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];