1326.推箱子

时限:1000ms 内存限制:10000K 总时限:3000ms
描述
绝大多数人都玩过推箱子的游戏,控制一个人将箱子推动到目标位置即获得胜利。现请你编写一个程序,判断将箱子推到目标位置至少需要多少步。

输入
推箱子的平面区域为固定大小(10*10),使用10行10列输入推箱子的初始局面。其中,0代表空格,1代表墙,2代表箱子,3代表目标位置,4代表人。
注:游戏中只有一个箱子,一个目标位置,一个人。

输出
输出将箱子推到目标位置的最小步数;若箱子不可能被推到目标位置,输出-1。

输入样例
0000000000
0000000300
0100000000
0100000000
0101111100
0000010000
0000010000
0020010040
0000010000
0000010000

输出样例
34

#include <iostream>
#include <queue>using namespace std;int maze[10][10];struct node
{int px,py;  //箱子位置int bx,by;  //人位置bool useful;    //本节点是否有效
};                  //无效条件:箱子越界、撞墙、节点重复node start;int tx,ty;  //目标位置queue <node> q1;int used[10][10][10][10];   //判重数组int step[10][10][10][10];   //步数数组int walk[4][2]= //走一步后的新坐标变化
{0, -1,  //左+1, 0,  //下0, +1,  //右-1, 0   //上
};void input();int bfs();node moveto(node cur, int i);   //返回人向i方向走一格的新节点int main()
{input();cout<<bfs()<<endl;return 0;
}void input()
{for(int i=0; i<10; i++){for(int j=0; j<10; j++){maze[i][j]=cin.get()-'0';   //将数字按字符读入,再转换成数字switch(maze[i][j]){case 2: //箱子{start.bx=i;start.by=j;maze[i][j]=0;   //将此处标记为0,意为“可以走”break;}case 3: //目标位置{tx=i;ty=j;maze[i][j]=0;   //同上break;}case 4: //人{start.px=i;start.py=j;maze[i][j]=0;   //同上break;}default:break;}}cin.get();  //此处!吃掉回车}//标记初始节点并入队used[start.bx][start.by][start.px][start.py]=1;step[start.bx][start.by][start.px][start.py]=0;q1.push(start);
}int bfs()
{node cur,next;while(!q1.empty()){cur=q1.front();q1.pop();for(int i=0; i<4; i++)  //人向4个方向试探{next=moveto(cur, i);    //返回扩展所得的新节点if(next.useful)     //若该节点有效{if(next.bx==tx&&next.by==ty)    //判断箱子是否到达目标位置{return step[next.bx][next.by][next.px][next.py];}else    //还未到达,新节点入队{q1.push(next);}}}}return -1;  //无法到达,返回-1
}//节点无效条件:箱子或人越界、箱子或人撞墙、节点重复
node moveto(node cur, int i)
{node next;next.bx=cur.bx;     //箱子位置暂时不动next.by=cur.by;next.px=cur.px+walk[i][0];  //人向i方向移动一格next.py=cur.py+walk[i][1];if(next.px==next.bx&&next.py==next.by)  //若此时人与箱子位置重叠{next.bx+=walk[i][0];        //那么箱子也要向i方向移动一格next.by+=walk[i][1];}//判断新节点next是否有效next.useful=false;  //初始为无效if(next.bx>=0&&next.bx<10&&next.by>=0&&next.by<10       //箱子不越界&&next.px>=0&&next.px<10&&next.py>=0&&next.py<10)    //&&人不越界{if(maze[next.bx][next.by]==0        //箱子所在位置不是墙&&maze[next.px][next.py]==0)     //&&人所在位置不是墙{if(used[next.bx][next.by][next.px][next.py]==0) //节点不重复{next.useful=true;   //同时满足上述条件,该节点才有效//标记“到达过”和“到达步数”used[next.bx][next.by][next.px][next.py]=1;step[next.bx][next.by][next.px][next.py]=1+step[cur.bx][cur.by][cur.px][cur.py];}}}return next;    //返回新节点
}

【NOJ1326】【算法实验三】推箱子相关推荐

  1. 算法实验三 【电子老鼠闯迷宫】分支限界

    算法实验三 [电子老鼠闯迷宫]分支限界 1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元 ...

  2. 【NOJ1571】【算法实验三】【分支限界法】八数码

    1571.八数码 时限:5000ms 内存限制:20000K  总时限:10000ms 描述 在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几 ...

  3. 【NOJ1130】【算法实验三】polygon

    1130.polygon 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 在一个周长为10000的圆上等距分布着n个点,即这n个点是一个正n边形的顶点.现在要另加m个点到圆上 ...

  4. 【NOJ1325】【算法实验三】【分支限界法】特殊的二阶魔方

    1325.特殊的二阶魔方 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 魔方大家应该都玩过.现在有一个特殊的二阶魔方,它只有一面是白色,其余五个面全是黑色.玩这个魔方当然也 ...

  5. 算法实验三 Problem B电子老鼠闯迷宫

    Problem B 电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建 ...

  6. NOJ1042——算法实验三——电子老鼠闯迷宫

    电子老鼠闯迷宫 描述: 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路.电子老鼠可以在路上向上.下.左.右行走,每一步走一个格子.现给定一 ...

  7. 【NOJ1042】【算法实验三】电子老鼠闯迷宫

    1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部 ...

  8. 【NOJ1147】【算法实验三】木乃伊迷宫

    1147.木乃伊迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵! ...

  9. 【算法实验三】(BFS-分支限界)【木乃伊迷宫】

    1147.木乃伊迷宫 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 木乃伊地下宫殿是一个6行6列的迷宫.作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵 ...

最新文章

  1. fork/join 并行编程
  2. ssl以及构建私有CA
  3. 居然出错.谁能帮我解决一下.
  4. python3 导入自定义函数
  5. 使用关指定中断解决资源冲突问题
  6. 容器日志管理 (2) 开源日志管理方案 ELK/EFK
  7. mysql 5.7.21-linux_MySQL 5.7.21 Linux平台安装 Part 2
  8. python具体应用过程_python公开课|Python for循环的具体应用就是python流程控制的核心,想学会就来看看...
  9. 新学期,对同学们的要求和期望
  10. linux下的shell脚本(基本)
  11. ip登陆异常 php,PHP实例:PHP制作登录异常ip检测功能的实例代码
  12. ubuntu16.04登录后无dash,无启动栏launch,无menu bar,只有桌面背景解决办法
  13. 给浪费时间找种方法?
  14. OpenCV-图像处理(08、模糊图像一)
  15. 我的世界java版怎么打开聊天栏_我的世界JAVA版才有的隐藏模式只有开发者才知道怎么进入...
  16. Vmware、Hyper-V、Virtual PC虚拟机运用usb server使用USB加密狗设备
  17. GOBY--一款攻击面测绘工具的使用
  18. 利用Python中的requests+wget批量下载微信页面上的音频
  19. 读书笔记:《过程咨询 II》
  20. python打开文件方式

热门文章

  1. java 斗地主_基于java实现斗地主代码实例解析
  2. Android 七大布局属性总结
  3. DeskViewer基于Silverlight 2.0开发的个性相册展示系统
  4. loadrunner文件保存
  5. Swift3.0语言教程字符串大小写转化
  6. 如何从官网下载jdk_如何从官网下载itunes
  7. 【MSP430】MSP430F5529火箭板 --> 按键中断控制LED实验
  8. 挽救损坏的 Word 文档
  9. tableau数据分析实战作业
  10. 托福备考需要准备哪些材料【zhasite】