题目大意:m * n 的地图,机器人要从(0, 0)走到(m, n),上下左右移动,0 可走 1 为障碍,k 表示可以连续通过的障碍数,输出最小步数,到达不了输出 -1
解题思路:vis 多一维判断已经通过的障碍,别的就是套 BFS
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string>
#include<queue>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
const int MAXN = 200+10;
using namespace std;
int T, k, n, m;
int map[MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
struct point {
int x, y;
int cnt;
int k;
};
int bfs() {
queue<point> q;
point now, p;
now.x = now. y = now.cnt = now.k = 0;
q.push(now);
vis[0][0][0] = 1;
while (!q.empty()) {
now = q.front();
q.pop();
//printf("%d %d %d\n", now.x, now.y, now.k);
if (now.x == n-1 && now.y == m-1) return now.cnt;
for (int i = 0; i < 4; i++) {
p = now;
p.x += dx[i];
p.y += dy[i];
p.cnt++;
if (map[p.x][p.y]) p.k++;
else p.k = 0;
if (p.x < 0 || p.x >= n || p.y < 0 || p.y >= m) continue;
if (!vis[p.x][p.y][p.k] && p.k <= k) {
//printf("==%d %d %d\n", p.x, p.y, p.k);
q.push(p);
vis[p.x][p.y][p.k] = 1;
}
}
}
return -1;
}
int main() {
scanf("%d", &T);
while (T--) {
memset(vis, 0, sizeof(vis));
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &map[i][j]);
printf("%d\n", bfs());
}
return 0;
}