您的位置:首页 > 其它

UVA 1600 Patrol Robot

2016-02-27 18:17 232 查看
题意:一个机器人从m*n的格子的左上角(1,1)走到右下角(m,n),格子是空地或者障碍,机器人每次可以向四个方向走一步,但是不能穿越连续k个障碍,求最短步数。

思路:bfs求最短路。考虑一种情况,对于一个位置,可能先连续穿越障碍去接近这个点,步数最小。但是如果这个点四周都是障碍,而现在连续穿越的障碍数已经达到上限了,这条路就没法继续走下去了。反之如果一开始绕一下路使得到达该点时连续穿越的障碍数小一些,那么这条路就可以通了。所以考虑一个点能不能走多次,就是看当前到达这个点连续穿越的障碍数是不是比之前的要少,就可以更新一下。

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

using namespace std;

#define rep(i,j,k) for(int i = j; i <= k; i++ )
#define Rrep(i,j,k) for(int i = j; i >= k; i-- )
#define Clean(x,y) memset(x,y,sizeof(x))

const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};

struct node
{
int x,y,step,now;
node(int a = 0,int b = 0,int c = 0,int d = 0):x(a),y(b),step(c),now(d){}
};

int T;
int k,n,m;
int map[30][30];
int t[30][30]; //记录到达当前点需要连续穿过的障碍数

int bfs()
{
int tx,ty;
queue<node> q;
q.push( node(1,1,0,0) );
node temp;
rep(i,1,n)
rep(j,1,m) t[i][j] = 1000;
while(!q.empty())
{
temp = q.front();
if ( temp.x == n && temp.y == m )
{
return temp.step;
}
q.pop();
rep(i,0,3)
{
tx = temp.x + dx[i];
ty = temp.y + dy[i];
int p = ( map[tx][ty]==1 ? temp.now+1 : 0 );
if ( tx>=1 && tx<=n && ty>=1 && ty<=m && p<t[tx][ty] )
{
t[tx][ty] = p;
if ( map[tx][ty] == 1  &&  temp.now >= k ) continue;
q.push( node( tx,ty,temp.step+1,p ) );
}
}
}
return -1;
}

int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
cin>>k;
rep(i,1,n)
rep(j,1,m) scanf("%d",&map[i][j]);
cout<<bfs()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: