题意:推箱子的题目,求最短的路径,如果推的最短一样的话,就算上走的最短
思路:首先我们记录状态:箱子的位置和人的位置,我们先BFS箱子的最短,然后我们可以通过推的方向得到人的位置,然后再BFS人是否能到这里的最短路
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MAXN = 50; struct status{ int person_x,person_y; int box_x,box_y; string ans; }p,q; struct node{ int x,y; string ans; }P,Q; int dx[]={1, -1, 0, 0}; int dy[]={0, 0, 1, -1}; char Pm[]={'s', 'n', 'e', 'w'}; char Pb[]={'S', 'N', 'E', 'W'}; int visP[MAXN][MAXN],visB[MAXN][MAXN]; char G[MAXN][MAXN]; int sx,sy,ex,ey,bx,by; int r,c; int check(int x, int y){ if (x >= 0 && x< r && y >= 0 && y < c) return true; return false; } int bfs2(int start_x, int start_y, int end_x, int end_y){ memset(visP, 0, sizeof(visP)); P.x = start_x; P.y = start_y; P.ans = ""; visP[P.x][P.y] = 1; visP[p.box_x][p.box_y] = 1; queue<node> qq; qq.push(P); while (!qq.empty()){ P = qq.front(); qq.pop(); if (P.x == end_x && P.y == end_y) return true; for (int i = 0; i < 4; i++){ int nx = P.x + dx[i]; int ny = P.y + dy[i]; if (check(nx, ny) && G[nx][ny] != '#' && !visP[nx][ny]){ visP[nx][ny] = 1; Q.ans = P.ans + Pm[i]; Q.x = nx; Q.y = ny; qq.push(Q); } } } return false; } int bfs(){ memset(visB, 0, sizeof(visB)); p.person_x = sx; p.person_y = sy; p.box_x = bx; p.box_y = by; p.ans = ""; visB[bx][by] = 1; queue<status> st; st.push(p); while (!st.empty()){ p = st.front(); st.pop(); for (int i = 0; i < 4; i++){ int nx = p.box_x + dx[i]; int ny = p.box_y + dy[i]; int tx = p.box_x - dx[i]; int ty = p.box_y - dy[i]; if (check(tx, ty) && G[tx][ty] != '#' && check(nx, ny) && G[nx][ny] != '#' && !visB[nx][ny]){ if (bfs2(p.person_x, p.person_y, tx, ty)){ visB[nx][ny] = 1; q.person_x = p.box_x; q.person_y = p.box_y; q.box_x = nx; q.box_y = ny; q.ans = p.ans+P.ans+Pb[i]; if (nx == ex && ny == ey) return true; st.push(q); } } } } return false; } int main(){ int cas = 1; while (scanf("%d%d", &r, &c) != EOF && r+c){ for (int i = 0; i < r; i++){ scanf("%s", G[i]); for (int j = 0; j < c; j++){ if (G[i][j] == 'S'){ sx = i; sy = j; } if (G[i][j] == 'T'){ ex = i; ey = j; } if (G[i][j] == 'B'){ bx = i; by = j; } } } printf("Maze #%d\n", cas++); if (bfs()) printf("%s\n", q.ans.c_str()); else printf("Impossible.\n"); printf("\n"); } return 0; }