版权声明:欢迎转载!拒绝抄袭. https://blog.csdn.net/qq_36257146/article/details/88283116
#include <iostream>
#include <bits/stdc++.h>
#define maxn 21
using namespace std;
struct Node
{
int r,c,k;
Node(int a,int b,int d):r(a),c(b),k(d) {}
Node() {}
};
int maze[maxn][maxn];
int dr[4] = {0,-1,0,1};
int dc[4] = {-1,0,1,0};
int m,n,k;
bool vis[maxn][maxn][maxn];
Node p[maxn][maxn][maxn];
bool bound(int r,int c)
{
return r<=m&&r>=1&&c<=n&&c>=1;
}
void BFS(Node u)
{
int r1,c1,k1 = 0;
queue<Node>q;
q.push(u);
r1 = u.r;
c1 = u.c;
vis[r1][c1][k1] = 1;
while(!q.empty())
{
Node v = q.front();
q.pop();
if(v.r == m && v.c == n)
{
cout<<"d"<<endl;
return;
}
for(int i = 0; i<4; i++)
{
r1 = v.r+dr[i];
c1 = v.c+dc[i];
if(maze[r1][c1])
{
if(maze[v.r][v.c])
k1 = v.k+1;
else
k1 = 1;
}
else
{
k1 = 0;
}
if(!vis[r1][c1][k1]&&k1<=k&&bound(r1,c1))
{
vis[r1][c1][k1] = 1;
p[r1][c1][k1] = v;
q.push(Node(r1,c1,k1));
if(r1 == m && c1 == n)
{
return ;
}
}
}
}
}
int main()
{
int T;
int r2,c2,k2;
int ans,flag;
Node u;
cin>>T;
while(T--)
{
ans = 0;
flag = 0;
cin>>m>>n>>k;
memset(vis,0,sizeof(vis));
memset(p,0,sizeof(p));
for(int i = 1; i<=m; i++)
for(int j = 1; j<=n; j++)
cin>>maze[i][j];
BFS(Node(1,1,0));
r2 = m;
c2 =n;
for(int i = k;i>=0;i--)
{
if(vis[r2][c2][i])
{
flag = 1;
k2 = i;
break;
}
}
if(!flag) ans = -1;
else
{
while(!(r2 == 1 && c2 == 1))
{
u = p[r2][c2][k2];
r2 = u.r;
c2 = u.c;
k2 = u.k;
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
/**
3
2 5
0
0 1 0 0 0
0 0 0 1 0
4 6
1
0 1 1 0 0 0
0 0 1 0 1 1
0 1 1 1 1 0
0 1 1 1 0 0
2 2
0
0 1
1 0
**/