uva1600 Patrol Robot

题意:每个机器人有一个连续穿越k道墙的属性,然后这里走过的点可能会重复路过,对于每个点需要加一个属性,第几次穿墙路过此地。所以这题标记数组是三维的,其他就是广搜模板。

#include<bits/stdc++.h>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793

typedef long long ll;
const ll mod=1000000007;
const int inf=0x7fffffff;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
using namespace std;
struct node
{
    int x,y,t;
};
int M[50][50],v[50][50][50],n,m,k,nxt[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
queue<node>que;
int main()
{
     int T;scanf("%d",&T);
     while(T--){
        int ok=0;
        scanf("%d %d %d",&n,&m,&k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&M[i][j]);
            }
        }
        memset(v,0,sizeof(v));
        while(!que.empty()) que.pop();
        que.push(node{1,1,0});
        v[1][1][0]=1;
        while(!que.empty()){
             node now=que.front();
            // cout<<now.x<<now.y<<endl;
             que.pop();
             if(now.x==n&&now.y==m){
                 printf("%d\n",v[now.x][now.y][now.t]-1);
                 ok=1;
                 break;
             }
             for(int i=0;i<4;i++){
                node nt;
                nt.x=now.x+nxt[i][0];
                nt.y=now.y+nxt[i][1];
                if(M[nt.x][nt.y]==1) nt.t=now.t+1;
                else nt.t=0;
                if(nt.x<1||nt.y<1||nt.x>n||nt.y>m||(M[nt.x][nt.y]==1&&now.t>=k)||v[nt.x][nt.y][nt.t]>0) continue;
                v[nt.x][nt.y][nt.t]=v[now.x][now.y][now.t]+1;
                que.push(nt);
             }
        }
        if(!ok)
        printf("-1\n");
     }
}

你可能感兴趣的:(uva)