node.state代表此时已经走了几个障碍,node.step代表到达此状态需要走几步
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
typedef struct node{
int x;
int y;
int state;
int step;
node(int p = 0, int q = 0, int o = 0, int u = 0):x(p), y(q), state(o), step(u){}
}node;
int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int a[30][30];
int m, n, k;
queue<node> que;
int dis[30][30];
int vis[30][30][30];
int bfs()
{
while(!que.empty())
que.pop();
for(int i = 0; i < 30; i++)
for(int j = 0; j < 30; j++)
for(int k = 0; k < 30; k++)
vis[i][j][k] = 0;
vis[1][1][0] = 1;
que.push(node(1,1,0,0));
while(!que.empty())
{
node front = que.front();
que.pop();
if(front.x == m && front.y == n)
return front.step;
for(int i = 0; i < 4; i++)
{
int x = front.x + dx[i];
int y = front.y + dy[i];
if(a[x][y] == -1)
continue;
if(a[x][y] == 1)
{
if(front.state + 1 > k)
continue;
else
if(!vis[x][y][front.state+1])
{
que.push(node(x, y, front.state+1, front.step+1));
vis[x][y][front.state+1] = 1;
}
}
if(a[x][y] == 0 && !vis[x][y][0])
{
vis[x][y][0] = 1;
que.push(node(x, y, 0, front.step+1));
}
}
}
return -1;
}
int main()
{
//freopen("ztest.txt","r",stdin);
//freopen("zans.txt","w",stdout);
int t;
scanf("%d", &t);
while(t--)
{
memset(a, -1, sizeof(a));
scanf("%d%d%d", &m, &n, &k);
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
printf("%d\n", bfs());
}
return 0;
}