CodeForces Gym 100735C BFS
2016-07-22 00:22
351 查看
就是一个迷宫,然后A可以自己选择去走,但是卫士在A走后会根据A的位置去走,问A能不能拿到那个护身符,假如A拿到后下一步就被卫士干死,也是认为他不能拿到的
就BFS让A走,然后卫士就根据A去模拟就行,状态记录就是walk[ra][ca][rg][cg],表示 A和卫士各自在的位置,然后就BFS跑就行,只是挺烦的,就错了一个地方,&&改成||就能AC,然后以为自己错误很多就没去查,,,,简直智障
就BFS让A走,然后卫士就根据A去模拟就行,状态记录就是walk[ra][ca][rg][cg],表示 A和卫士各自在的位置,然后就BFS跑就行,只是挺烦的,就错了一个地方,&&改成||就能AC,然后以为自己错误很多就没去查,,,,简直智障
#include <cstdio> #include <cstring> #include <vector> #include <iostream> #include <string> #include <cmath> #include <algorithm> #include <set> #include <map> #include <queue> using namespace std; const int dx[4] = { -1, 1, 0, 0 };//上下左右 const int dy[4] = { 0, 0, -1, 1 }; struct Node { int ra, ca, rg, cg, cnt; Node() : ra(0), ca(0), rg(0), cg(0), cnt(0) {} Node(int ra, int ca, int rg, int cg, int cnt) { this->ra = ra; this->ca = ca; this->rg = rg; this->cg = cg; this->cnt = cnt; } }; int N, M; char grid[30][30]; bool walk[30][30][30][30]; int main() { //freopen("input.txt", "r", stdin); scanf("%d%d", &N, &M); for (int i = 0; i < N; ++i) scanf("%s", grid[i]); Node st; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (grid[i][j] == 'A') { st.ra = i; st.ca = j; grid[i][j] = '.'; } else if (grid[i][j] == 'G') { st.rg = i; st.cg = j; grid[i][j] = '.'; } } } st.cnt = 0; /*printf("N %d M %d\n", N, M); for (int i = 0; i < N; ++i) printf("%s\n", grid[i]);*/ //printf("ra %d ca %d rg %d cg %d\n", st.ra, st.ca, st.rg, st.cg); walk[st.ra][st.ca][st.rg][st.cg] = true; queue<Node> Q; Q.push(st); Node t; int r1, c1, r2, c2; int ans = -1; while (!Q.empty()) { t = Q.front(); Q.pop(); if (grid[t.ra][t.ca] == 'P') { ans = t.cnt; break; } for (int i = 0; i < 4; ++i) { r1 = t.ra + dx[i]; c1 = t.ca + dy[i]; //printf("a %d %d %c\n", r1, c1, grid[r1][c1]); //printf("rg %d cg %d\n", t.rg, t.cg); if (r1 >= 0 && r1 < N&&c1 >= 0 && c1 < M&&grid[r1][c1] != 'X' && (r1 != t.rg || c1 != t.cg)) { //printf("a go %d %d\n", r1, c1); bool guard = false; if (t.cg < c1) { c2 = t.cg + 1; r2 = t.rg; if (c2 == c1&&r2 == r1) continue; if (grid[r2][c2] != 'X') { guard = true; } } else if (t.cg > c1) { c2 = t.cg - 1; r2 = t.rg; if (c2 == c1&&r2 == r1) continue; if (grid[r2][c2] != 'X') { guard = true; } } if (!guard) { if (t.rg < r1) { r2 = t.rg + 1; c2 = t.cg; if (c2 == c1&&r2 == r1) continue; if (grid[r2][c2] != 'X') { guard = true; } } else if (t.rg>r1) { r2 = t.rg - 1; c2 = t.cg; if (c2 == c1&&r2 == r1) continue; if (grid[r2][c2] != 'X') { guard = true; } } } if (guard == false)//guard下一步是野兽,所以不能走 { r2 = t.rg; c2 = t.cg; } if (!walk[r1][c1][r2][c2]) { //printf("%d %d %d %d\n", r1, c1, r2, c2); Q.push(Node(r1, c1, r2, c2, t.cnt + 1)); walk[r1][c1][r2][c2] = true; } } } if (ans > -1) break; } printf("%d\n", ans); //system("pause"); //while (1); return 0; }
相关文章推荐
- 编译安装httpd2.2.4
- Android自定义View系列(二)——打造一个仿2K游戏摇杆
- Android自定义View系列(一)——打造一个爱心进度条
- 设计模式学习之—观察者模式
- 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)
- opengl 第一个小游戏
- poj1328雷达设置 贪心
- 蓝桥杯 ADV-11 算法提高 Torry的困惑(提高型)
- 蓝桥杯 ALGO-8 算法训练 操作格子(线段树)
- AspectJ的切入点表达式---execution表达式详解
- POJ 2253 Frogger (dijkstra 最大边最小)
- 小白学习python之路-----笔记(一)
- CodeForces Gym 100735B 矩阵快速幂
- Another kind of Fibonacci(hdu3306)矩阵快速幂
- [LeetCode] 49. Group Anagrams
- [C#]银行家算法的实现
- 蓝桥杯ADV-17算法提高 统计单词数
- 蓝桥杯 ALGO-11算法训练 瓷砖铺放(递归/动态规划)
- jQuery--引入,基本语法,以及常用事件
- hibernate与struts2一起时的异常处理