UVA

来源:互联网 发布:阿里云域名记录类型 编辑:程序博客网 时间:2024/05/16 13:52

题目大意: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;}
原创粉丝点击