UVA 1600 Patrol Robot


题意:一个机器人从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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值