题意:每个机器人有一个连续穿越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");
}
}