[kuangbin带你飞]专题二-搜索进阶-D-Escape
2017-04-15 18:59
423 查看
ACM模版
矩阵的搜索一般使用 bfs 比较多,也比较好,这里的标记要用一个三维数组,多出来的一维用来标记时间,记住要用 bool 型,习惯性的使用 int 型会爆内存的,其他也没啥可多说的了。
描述
题解
这种问题不难,无非两点,一:看懂题,二:细心。矩阵的搜索一般使用 bfs 比较多,也比较好,这里的标记要用一个三维数组,多出来的一维用来标记时间,记住要用 bool 型,习惯性的使用 int 型会爆内存的,其他也没啥可多说的了。
代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int MAXN = 105; const int MAXT = 1e3 + 10; const int dir[5][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {0, 0}}; int m, n, k, d, res; bool vis[MAXT][MAXN][MAXN]; struct castle { char c; int t, v; } cte[MAXN][MAXN]; struct node { int x, y; int step; node(int x_, int y_, int s_) : x(x_), y(y_), step(s_) {} }; void init() { res = -1; memset(vis, 0, sizeof(vis)); memset(cte, 0, sizeof(cte)); } bool check(int x,int y) { if (x >= 0 && x <= m && y >= 0 && y <= n) { return 1; } return 0; } void bfs() { queue<node> Q; Q.push(node(0, 0, 0)); vis[0][0][0] = 1; while (!Q.empty()) { node q = Q.front(); Q.pop(); if (q.step > d) { return ; } if (q.x == m && q.y == n) { res = q.step; return ; } for (int i = 0; i < 5; i++) { node nd = q; nd.x += dir[i][0]; nd.y += dir[i][1]; nd.step++; if (!check(nd.x, nd.y)) { continue; } if (!vis[nd.step][nd.x][nd.y] && !cte[nd.x][nd.y].t) { int flag = 1; int dis; for (int k = nd.x - 1; k >= 0; k--) { if (cte[k][nd.y].t) { if (cte[k][nd.y].c == 'S') { dis = nd.x - k; if (dis % cte[k][nd.y].v) { break; } int temp = dis / cte[k][nd.y].v; if (nd.step < temp) { break; } temp = nd.step - temp; if (temp % cte[k][nd.y].t) { break; } flag = 0; break; } break; } } if (!flag) { continue; } for (int k = nd.x + 1; k <= m; k++) { if (cte[k][nd.y].t) { if (cte[k][nd.y].c == 'N') { dis = k - nd.x; if (dis % cte[k][nd.y].v) { break; } int temp = dis / cte[k][nd.y].v; if (nd.step < temp) { break; } temp = nd.step - temp; if (temp % cte[k][nd.y].t) { break; } flag = 0; break; } break; } } if (!flag) { continue; } for (int k = nd.y + 1; k <= n; k++) { if (cte[nd.x][k].t) { if (cte[nd.x][k].c == 'W') { dis = k - nd.y; if (dis % cte[nd.x][k].v) { break; } int temp = dis / cte[nd.x][k].v; if (nd.step < temp) { break; } temp = nd.step - temp; if (temp % cte[nd.x][k].t) { break; } flag = 0; break; } break; } } if (!flag) { continue; } for (int k = nd.y - 1; k >= 0; k--) { if (cte[nd.x][k].t) { if (cte[nd.x][k].c == 'E') { dis = nd.y - k; if (dis % cte[nd.x][k].v) { break; } int temp = dis / cte[nd.x][k].v; if (nd.step < temp) { break; } temp = nd.step - temp; if (temp % cte[nd.x][k].t) { break; } flag = 0; break; } break; } } if (flag) { vis[nd.step][nd.x][nd.y] = 1; Q.push(nd); } } } } } int main() { while (~scanf("%d%d%d%d", &m, &n, &k, &d)) { init(); char c[3]; int t, v, x, y; for (int i = 0; i < k; i++) { scanf("%s%d%d%d%d", c, &t, &v, &x, &y); cte[x][y].c = c[0]; cte[x][y].t = t; cte[x][y].v = v; } bfs(); if (res != -1) { printf("%d\n", res); } else { printf("Bad luck!\n"); } } return 0; }
相关文章推荐
- 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
- [kuangbin带你飞]专题二 搜索进阶 C
- [kuangbin带你飞]专题二 搜索进阶 I
- [kuangbin带你飞]专题二 搜索进阶 A(康拓展开+bfs)
- [kuangbin带你飞]专题二 搜索进阶 E
- [kuangbin带你飞]专题二-搜索进阶-C-哈密顿绕行世界问题
- [kuangbin带你飞]专题二 搜索进阶 G
- [kuangbin带你飞]专题二 搜索进阶 I - A计划(HDU 2102)
- [kuangbin带你飞]专题二 搜索进阶 I - A计划
- [kuangbin带你飞]专题二-搜索进阶-A-Eight
- [kuangbin带你飞]专题二 搜索进阶 D
- [kuangbin带你飞]专题二 搜索进阶
- [kuangbin带你飞]专题二 搜索进阶 A - Eight
- [kuangbin带你飞]专题二 搜索进阶 C - 哈密顿绕行世界问题(HDU 2181)
- [kuangbin带你飞]专题二-搜索进阶-B-Eight II
- [kuangbin带你飞]专题二 搜索进阶 题解(康托展开、映射、迭代加深)
- POJ - 3984 迷宫问题 [kuangbin带你飞]专题一 简单搜索
- Fire Game [kuangbin带你飞]专题一 简单搜索
- 1321 棋盘问题 &[kuangbin带你飞]专题一 简单搜索 A