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;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- java-jpa-criteriaBuilder使用入门
- java与模式之—里氏代换原则(LSP)
- 方法重载和重写的区别
- NoClassDefFoundError: java/util/zip/ZipError
- powerDesigner 从数据库导出表结构,并生产excel ,有效
- UVA
- 【小程序合集】哪个游戏可以陪你度过周末?
- frameset标签(HTML框架)
- 排队的奶牛
- mysql 5.7.19 免安装版配置方法
- C# 排序算法
- 状态和无状态--2种服务器架构之间的比较
- Jenkins配置-打包到服务器
- 暑期学习记录11