题目链接:点击查看

题目大意:要求模拟推箱子游戏的过程,输出最优路径,最优路径要求箱子移动的次数最少,次为人移动的次数最少

题目分析:这个题可以简化成两个相互依附的东西同时走迷宫,因为首先要求箱子移动的次数最少,所以我们在最外层设置一层bfs用来搜索箱子的最优解,其次是要求人的移动次数最少,我们可以在内层设置一个BFS用来搜索人的最优解,这样的时间复杂度是n*n*m*m,题目给出的n和m最大为20,20的四次方也才160000,内存和时间都合适

注意一下,这个题目没有那么多坑,每个地图中只有一个箱子,一个起点,一个终点,我看网上有人嵌套bfs时用了一个四位vis来记录状态,我感觉没那个必要,就只是开了两个二维的vis和book分别记录箱子的状态和人的状态,可以达到同样的效果,其次就是需要注意一下,当进入人的BFS时,箱子所在的那一格需要视为墙,我们只需要在搜索之前将箱子所在的那一格的状态设置为true即可,还有就是路径记录问题,因为数据量比较小,我直接用string暴力传递的,因为模拟链表真的有点烧脑子嗷嗷嗷,目前就被一个题目卡了内存,其他的题目还是可以直接用string或vector暴力传递滴

思路清晰点写一遍能调过样例肯定就没问题了,上代码吧:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=25;const int b[4][2]={0,1,0,-1,1,0,-1,0};const char man[4]={'e','w','s','n'};const char box[4]={'E','W','S','N'};int n,m;string ans,str;char maze[N][N];bool vis[N][N],book[N][N];bool check(int x,int y)
{if(x<0||y<0||x>=n||y>=m)return false;if(maze[x][y]=='#')return false;return true;
}struct Node
{int x,y,bx,by;string path;Node(int X,int Y,int BX,int BY,string PATH){x=X;y=Y;bx=BX;by=BY;path=PATH;}Node(){}
};bool BFS(int x,int y,int xxx,int yyy,int px,int py)//搜索人的路径,简单bfs
//上述六个参数分别代表:起点x,起点y,终点x,终点y,箱子x,箱子y
{memset(book,false,sizeof(book));//记得初始化queue<Node>q;q.push(Node(x,y,0,0,""));book[x][y]=true;book[px][py]=true;//记得将箱子坐标的状态设为truewhile(!q.empty()){Node cur=q.front();q.pop();if(cur.x==xxx&&cur.y==yyy){str=cur.path;return true;}for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];if(!check(xx,yy))continue;if(book[xx][yy])continue;book[xx][yy]=true;q.push(Node(xx,yy,0,0,cur.path+man[i]));}}return false;
}bool bfs()//搜索箱子的路径,稍微多了几个条件的bfs
{memset(vis,false,sizeof(vis));//记得初始化Node temp;temp.path="";for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(maze[i][j]=='B'){temp.bx=i;temp.by=j;}else if(maze[i][j]=='S'){temp.x=i;temp.y=j;}queue<Node>q;q.push(temp);while(!q.empty()){Node cur=q.front();q.pop();if(maze[cur.bx][cur.by]=='T'){ans=cur.path;return true;}for(int i=0;i<4;i++)//模拟推箱子的过程{int xx=cur.bx+b[i][0];//计算箱子应到达的位置int yy=cur.by+b[i][1];if(!check(xx,yy))//检查坐标合理性continue;int xxx=cur.bx-b[i][0];//计算人应到达的位置int yyy=cur.by-b[i][1];if(!check(xxx,yyy))//检查坐标合理性continue;if(vis[xx][yy])continue;if(!BFS(cur.x,cur.y,xxx,yyy,cur.bx,cur.by))//计算人能否到达continue;vis[xx][yy]=true;q.push(Node(cur.bx,cur.by,xx,yy,cur.path+str+box[i]));//若能到达更新状态}}return false;
}int main()
{
//  freopen("input.txt","r",stdin);int kase=0;while(scanf("%d%d",&n,&m)!=EOF&&n+m){for(int i=0;i<n;i++)scanf("%s",maze[i]);printf("Maze #%d\n",++kase);if(bfs())cout<<ans<<endl<<endl;elsecout<<"Impossible."<<endl<<endl;}return 0;
}

POJ - 1475 Pushing Boxes(bfs套bfs)相关推荐

  1. poj 1729 Jack and Jill 1376 Robot 1324 Holedox Moving 1475 Pushing Boxes bfs + a*

    poj 1729 Jack and Jill Jack和Jill要从各自的家走到各自的学校,但是他们俩各自不喜欢对方,因此,需要你找到两个人行走的路线,使得他们路线中两个人最近的直线距离最长.单位时间 ...

  2. 【嵌套bfs】A - Pushing Boxes POJ - 1475 推箱子

    https://vjudge.net/contest/387870#problem/A 题目描述 Imagine you are standing inside a two-dimensional m ...

  3. 搜索技术【广度优先搜索】 - 嵌套广度优先搜索 【POJ No. 1475】 推箱子 Pushing Boxes

    搜索技术[广度优先搜索] - 嵌套广度优先搜索 [POJ No. 1475] 推箱子 Pushing Boxes 在广度优先搜索里面嵌套广度优先搜索的算法被称为嵌套广度优先搜索(或称双重广度优先搜索) ...

  4. 【POJ 1475】 Pushing Boxes

    [题目链接] http://poj.org/problem?id=1475 [算法] 双重BFS [代码] #include <algorithm> #include <bitset ...

  5. leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过

    本文目录 leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过~ 写在前面 题目 示例 提示 思路 代码实现 执行结果 写在最后 leetcode每日一题1609. 奇 ...

  6. (POJ 3026) Borg Maze 最小生成树+bfs

    题目链接:http://poj.org/problem?id=3026. DescriptionThe Borg is an immensely powerful race of enhanced h ...

  7. POJ 3278 Catch That Cow(BFS)

    题目网址:http://poj.org/problem?id=3278 题目: Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  8. POJ 2251 Dungeon Master(三维BFS求最短路径)

    3D dungeon 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版][命题人:201506020829][Edit] [TestData] 题 ...

  9. poj 3278 Catch That Cow (bfs)

    题目:http://poj.org/problem?id=3278 题意: 给定两个整数n和k 通过 n+1或n-1 或n*2 这3种操作,使得n==k 输出最少的操作次数 1 #include< ...

最新文章

  1. WordPress更新时提示无法连接到FTP服务器的解决方案
  2. boost::mp11::mp_bind_q相关用法的测试程序
  3. 用AI击破传统行业痛点 “百度大脑行业创新论坛”将提7大行业解决方案
  4. 弄清 CSS3 的 transition 和 animation
  5. RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列
  6. debugfs查看文件块号,dd命令读指定块号的内容
  7. ubuntu下设置Android手机驱动
  8. java中修改对象类的数据_Java中创建对象的六个步骤 细分后(new关键字)对象头详细介绍...
  9. 软考-中级-网络工程师-2021年下半年-上午真题整理
  10. paraview参考手册6:远程并行可视化
  11. 谷歌地图动画_Google地图上的动画路线
  12. AirServer无线手机投屏镜像mac电脑上面教程
  13. MATLAB-SIMULINK-二极管搭建整流电路(1)
  14. Compose Modifier
  15. matlab8邻域搜索算法,一种基于可搜索连续邻域A*算法的路径规划方法与流程
  16. 【计算机毕业设计】437物流管理系统设计与实现
  17. Python和VizViewer进行自动驾驶数据集可视化
  18. 复旦大学计算机a类专业,复旦大学a类学科有哪些?附复旦a类学科名单
  19. SAP重置公司代码资产会计(FI-AA)数据-OABL
  20. iOS设置icon图标和启动页的详细设置

热门文章

  1. 利用死信交换机接收死信
  2. 设计模式在Netty中的应用-迭代器模式源码举例
  3. 搭建基础架构-QueryRule
  4. HandlerAdapters
  5. 加速静态内容访问速度的CDN
  6. Spring Boot整合Spring Data Redis-存取JSON格式Java对象
  7. mysql日期/时间转换为字符串
  8. python查找指定字符串并替换_python 查找字符串并将其替换
  9. 利用python进行数据分析第二版pdf百度云_参考《利用Python进行数据分析(第二版)》高清中文PDF+高清英文PDF+源代码...
  10. linux密码忘记grub登陆,Linux忘记密码后使用grub重置密码