题意:
一个人拿着纸盒子往目的地走 正常情况下一秒走一格 可以原地不动躲在盒子里 也可以套着盒子三秒走一格 走路的原则是不能穿墙 而且地图上有些灯 灯能照到自己和面前一个格 每一秒灯顺时针转90度 如果要从灯照的地方离开或者进入灯照的地方就必须套上盒子 问 最短多长时间到目的地
思路:
状态只有500*500(地图大小)*4(灯转的4个方向)个 暴搜即可 bfs时候要利用优先队列
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<cassert> #include<vector> #include<set> #include<map> #include<queue> using namespace std; #define N 510 int maz[N][N], dir[4][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }; int dp[N][N][4]; int T, t, n, Sx, Sy, Ex, Ey; struct node { int x, y, t; bool operator<(const node ff) const { return t > ff.t; } } u, v; priority_queue<node> qu; void bfs() { int i, j, flag, x, y; memset(dp, -1, sizeof(dp)); dp[Sx][Sy][0] = 0; while (!qu.empty()) qu.pop(); u.x = Sx, u.y = Sy, u.t = 0; qu.push(u); while (!qu.empty()) { u = qu.top(); qu.pop(); v = u; v.t++; if (dp[v.x][v.y][v.t % 4] == -1 || dp[v.x][v.y][v.t % 4] > v.t) { dp[v.x][v.y][v.t % 4] = v.t; qu.push(v); } for (i = 0; i < 4; i++) { v.x = u.x + dir[i][0], v.y = u.y + dir[i][1]; if (maz[v.x][v.y] != -1) { flag = 0; if (maz[v.x][v.y] > 0) flag = 1; if (maz[u.x][u.y] > 0) flag = 1; for (j = 0; j < 4; j++) { x = u.x + dir[j][0], y = u.y + dir[j][1]; if (maz[x][y] > 0) { if (((maz[x][y] - 1 + u.t) % 4) == ((j + 2) % 4)) { flag = 1; break; } } x = v.x + dir[j][0], y = v.y + dir[j][1]; if (maz[x][y] > 0) { if (((maz[x][y] - 1 + u.t) % 4) == ((j + 2) % 4)) { flag = 1; break; } } } if (flag) v.t = u.t + 3; else v.t = u.t + 1; if (dp[v.x][v.y][v.t % 4] == -1 || dp[v.x][v.y][v.t % 4] > v.t) { dp[v.x][v.y][v.t % 4] = v.t; qu.push(v); } } } } } int main() { int i, j; char fmaz[N]; scanf("%d", &T); for (t = 1; t <= T; t++) { scanf("%d", &n); memset(maz, -1, sizeof(maz)); for (i = 1; i <= n; i++) { scanf("%s", fmaz + 1); for (j = 1; j <= n; j++) { if (fmaz[j] == '#') continue; maz[i][j] = 0; if (fmaz[j] == 'N') maz[i][j] = 1; else if (fmaz[j] == 'E') maz[i][j] = 2; else if (fmaz[j] == 'S') maz[i][j] = 3; else if (fmaz[j] == 'W') maz[i][j] = 4; else if (fmaz[j] == 'M') { Sx = i, Sy = j; } else if (fmaz[j] == 'T') { Ex = i, Ey = j; } } } bfs(); j = -1; for (i = 0; i < 4; i++) { if (dp[Ex][Ey][i] != -1 && (j == -1 || j > dp[Ex][Ey][i])) j = dp[Ex][Ey][i]; } printf("Case #%d: %d\n", t, j); } return 0; }
原文地址:http://blog.csdn.net/houserabbit/article/details/39522707