UVA
来源:互联网 发布:手机怎样举报淘宝卖家 编辑:程序博客网 时间:2024/06/15 10:25
/*
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4475
知识点:
带状态的 bfs
通过增加数组维度来实现
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4475
知识点:
带状态的 bfs
通过增加数组维度来实现
*/
#include <iostream>#include <cstring>#include <queue>#define rep(i, n) for ( int i = 0; i < (n); i++ )using namespace std;const int N = 25;int m, n, k, ans;int dxy[4][4] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };int map[N][N], vis[N][N][N];// vis 加第三个维度,其实是为了区分状态,比如同样是到达 (5,5) 这个位置,如果是已经连续通过 3 个障碍,和连续通过了2个障碍的时候,这两种情况,虽然最后都是到达 (5,5),但这其实是两种不同的状态// 所以,加入的第三个维度,就是为了记录,当前位置剩余的 "可连续通过的障碍数" struct node{int x, y, cnt, k; // cnt 保存的是从起点到该结点的最短路径长度,k保存的是当前该结点剩余的 "可连续穿过障碍数"node(int x1, int y1, int c, int k1){x = x1, y = y1, cnt = c, k = k1;}};void init(){memset(map, 0, sizeof(map));memset(vis, 0, sizeof(vis));cin >> n >> m >> k;rep(i, n) rep(j, m) cin >> map[i][j];}void bfs(){queue<node> q;node u(0, 0, 0, k);vis[0][0][k] = 1;q.push(u); while (!q.empty()){u = q.front();q.pop();if (u.x == n - 1 && u.y == m - 1){ans = u.cnt;return;}if (u.k >= 0){rep(i, 4){node v(u.x + dxy[i][0], u.y + dxy[i][1], u.cnt + 1, u.k - 1);if (!map[v.x][v.y]) v.k = k; //如果当前走的不是障碍处,则重置 kif ( v.k >= 0 && v.x >= 0 && v.x < n && v.y >= 0 && v.y < m && !vis[v.x][v.y][v.k] ){q.push(v);vis[v.x][v.y][v.k] = 1;}}}}ans = -1;}int main(){int t;cin >> t;while (t--){init();bfs();cout << ans << endl;}return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- 当头一棒!暴风这支“妖股”会被打回原形吗?
- 十张图读懂特斯拉Model 3的机遇和困境
- 优酷起诉乐视盗链 网络视频大战何时休?
- B树、B+树的java实现
- http请求的方法
- UVA
- 过去一周,我们都聊了硅谷哪些问题? | 硅谷锋向周刊
- 231N Lec6 课程笔记
- 学习FAT12
- 最基础的servlet自我理解
- SVM支持向量机(二)
- 如何用“魔兽”拯救赔本赚吆喝的互联网电视?
- 财富500强公司:用科技武装自己
- 从技术的角度讨论:谷歌有没有操纵搜索结果偏袒希拉里?