题目链接

http://poj.org/problem?id=1475

题意

推箱子游戏。输入迷宫、箱子的位置、人的位置、目标位置,求人是否能把箱子推到目标位置,若能则输出推的最少的路径,如果有多条步数相同的推的最少的路径,则输出总步数(人走的步数+推箱子的步数)最少的那条路径;若不能把箱子推到目标位置,则输出Impossible.

思路

先求出箱子到目标位置的最短路径(bfs_box),在bfs1推箱子的过程中,根据推的方向和箱子的位置得到人的位置,再求得人到达这个位置的最短路(bfs_person)即可。

代码

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
using namespace std; struct Node
{
int br, bc; //box_row,box_col
int pr, pc; //person_row,person_col
string ans; Node() {}
Node(int br, int bc, int pr, int pc, string ans) :br(br), bc(bc), pr(pr), pc(pc), ans(ans) {}
}; const int N = ;
int m, n;
char maze[N][N];
int dir[][] = { {-, }, {, }, {, -}, {, } };
char push[] = { 'N', 'S', 'W', 'E' };
char walk[] = { 'n', 's', 'w', 'e' };
int br, bc;
int pr, pc;
int tr, tc; bool ok(int r, int c)
{
if (r >= && r < m && c >= && c < n && maze[r][c] != '#')
return true;
return false;
} string tmp;
bool bfs_person(int sr, int sc, int er, int ec, Node node)
{
tmp = "";
int visit[N][N];
memset(visit, , sizeof(visit));
queue<Node> q;
q.push(Node(-, -, sr, sc, ""));
visit[sr][sc] = ;
visit[node.br][node.bc] = ; //注意
while (!q.empty())
{
Node cur = q.front();
q.pop();
if (cur.pr == er && cur.pc == ec)
{
tmp = cur.ans;
return true;
}
for (int i = ; i < ; i++)
{
int nr = cur.pr + dir[i][];
int nc = cur.pc + dir[i][];
if (ok(nr, nc) && !visit[nr][nc])
{
visit[nr][nc] = ;
string ans = cur.ans + walk[i];
q.push(Node(-, -, nr, nc, ans));
}
}
}
return false;
} string bfs_box()
{
int visit[N][N];
memset(visit, , sizeof(visit));
queue<Node> q;
q.push(Node(br, bc, pr, pc, ""));
visit[br][bc] = ;
while (!q.empty())
{
Node cur = q.front();
q.pop();
if (cur.br == tr && cur.bc == tc)
return cur.ans;
for (int i = ; i < ; i++)
{
int nr = cur.br + dir[i][];
int nc = cur.bc + dir[i][];
int pre_r = cur.br - dir[i][];
int pre_c = cur.bc - dir[i][];
if (ok(nr, nc) && ok(pre_r, pre_c) && !visit[nr][nc])
{
if (bfs_person(cur.pr, cur.pc, pre_r, pre_c, cur))
{
visit[nr][nc] = ;
Node next;
next.br = nr;
next.bc = nc;
next.pr = cur.br;
next.pc = cur.bc;
next.ans = cur.ans + tmp + push[i];
q.push(next);
}
}
}
}
return "Impossible.";
} int main()
{
//freopen("poj1475.txt", "r", stdin);
int cnt = ;
while (cin >> m >> n && m)
{
for (int i = ; i < m; i++)
{
for (int j = ; j < n; j++)
{
cin >> maze[i][j];
if (maze[i][j] == 'S')
{
pr = i;
pc = j;
}
else if (maze[i][j] == 'B')
{
br = i;
bc = j;
}
else if (maze[i][j] == 'T')
{
tr = i;
tc = j;
}
}
}
printf("Maze #%d\n", ++cnt);
cout << bfs_box() << endl << endl;
}
return ;
}

poj1475 Pushing Boxes(BFS)的更多相关文章

  1. POJ-1475 Pushing Boxes (BFS+优先队列)

    Description Imagine you are standing inside a two-dimensional maze composed of square cells which ma ...

  2. POJ1475 Pushing Boxes(双搜索)

    POJ1475 Pushing Boxes  推箱子,#表示墙,B表示箱子的起点,T表示箱子的目标位置,S表示人的起点 本题没有 Special Judge,多解时,先最小化箱子被推动的次数,再最小化 ...

  3. poj1475 Pushing Boxes[双重BFS(毒瘤搜索题)]

    地址. 很重要的搜索题.★★★ 吐槽:算是写过的一道码量比较大的搜索题了,细节多,还比较毒瘤.虽然是一遍AC的,其实我提前偷了大数据,但是思路还是想了好长时间,照理说想了半小时出不来,我就会翻题解,但 ...

  4. hihoCoder 1233 : Boxes(盒子)

    hihoCoder #1233 : Boxes(盒子) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 There is a strange ...

  5. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  6. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  7. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  8. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  9. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

随机推荐

  1. Codeforces 833B The Bakery dp线段树

    B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  2. python的StringIO模块

    StringIO经常被用来作字符串的缓存,因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作. 一.StringIO中的常用方法 1.r ...

  3. Vue DatePicker和不可用

    input控件可以直接设置disabled为不可用状态: DatePicker要想不可编辑,设置readonly属性即可 <DatePicker type="date" v- ...

  4. css之display:inline-block布局--转

    css之使用display:inline-block来布局   css之display:inline-block布局 1.解释一下display的几个常用的属性值,inline , block, in ...

  5. npm 的使用指南

    npm 使用指南 因为有写关于node.js的配置的博客,还有node和gulp的前端信息配置使用,其中有很多命令都用到了npm.所以这里要着重介绍一下npm. 1 npm介绍 npm(mode pa ...

  6. vue 和react

    React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件. 将注意力集中保持在核心库,而将其 ...

  7. 2017北京国庆刷题Day2 afternoon

    期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一 ...

  8. DIV+CSS制作斜线效果记录

    DIV+CSS 斜线效果很简单,只需设置一下CSS Border 的边框就能有斜线效果.代码分享给大家,你可以自己变通. 提示要注意两点:1.DIV宽高的定义.2.DIV在 IE6 中默认是有高度的. ...

  9. 判断是否引入jquery

    主要使用typeof检验 <script language="javascript"> if(typeof jQuery == 'undefined'){ window ...

  10. 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)

    题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...