只是记录一下自己的学习过程

推箱子游戏—深度优先探索版本

  • 题目描述
  • 我的简要分析
  • 详细代码

题目描述

推箱子是一款经典游戏。这里我们玩的是一个简单版本,就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,要求用深度优先搜索找到游戏的解(注意这里不保证步数最少)。
玩家每到一个格子,就按上(U),右®,下(D),左(L)顺时针方向尝试,每一个方向都都在前一个方向失败时才可能尝试。如下图,如果s6为终态,则游戏解为UU; 如果s21为终态,则玩家要尝试UU,UR,UD,UL,RU,RR,RD,RL,…,LD, 才能确定LL是游戏的解。


状态由玩家位置和箱子位置构成,算法结构大体如下:
DFS(state s){
for(i = 0; i < 4; i++)
DFS(trans(s, i)); //tans表示状态s往方向i走形成的新状态
}
注意得到解后要立即返回。

输入

第一行输入两个数字N,M表示地图的大小。其中0<N,M<=12。
接下来有N行,每行包含M个字符表示游戏地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。

输出

有解时,输出玩家走的每一步。当无论如何达成不了的时候,输出-1。

样例输入

6 6
…#…

#*##…
…##.#
…X…
.@#…

样例输出

RRUUULLULDDUURDRRURDDLDDRDLLULLUUDDRRRUUULLULLDRRRLULDDDDRRRUURUULDDDUULLULDDDDRRDRRULLLRRUUULLULDDDD

我的简要分析

这个题目与之前的广度优先版本差不多,不过是使用的探索方法不一样以及需要返回的参数不一样,关于这个问题的分析可以去我的上一篇博客看一下链接。

另外需要注意的是回溯的时候,操作存储是逆序的,所以输出的时候也需要逆序输出。

还有,跟一般的深度探索不一样,若是没有箱子的限制条件,标记位置是否走过的数组在回溯的时候需要清零。但是这个问题,我理解为箱子跟人这样一个位置关系是独立的,所以可以不用清零节约时间,但是起点不能标记,不然回溯之后不好探索其他方向。

强行解释,没有什么道理,懂的大佬可以在评论区解释一下,谢谢。

关于深度优先探索(DFS)推荐这篇博客 链接.

详细代码


#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;char zmap[20][20];      //地图
int  jmap[20][20][20][20] = { 0 };         //标记是否走过
int n1, m1;   //终点位置
int n2, m2;   //起点位置
int n3, m3;   //箱子位置
int n, m;     //地图大小
int  people[4][2] =         //人走的位置变化
{{-1,0},{0,1},{1,0},{0,-1},
};
char  road[100007];        //标记人走的路径
int  k = 0;char  vroad[4] = { 'U','R','D','L' };      //标记行走方向
int  liu = 0;     //记录到达终点以后的返回值//判断要走的位置是否符合规定
int OutMap(int a, int b)
{if (a >= 0 && a < n && b >= 0 && b < m && zmap[a][b] != '#')return 0;elsereturn 1;
}//深度优先探索
int  venture(int p1, int p2, int x1, int x2)
{//如果箱子位置与终点位置重合则探索结束进行回溯if (x1 == n1 && x2 == m1){return 1;}//分别判断此时位置的四个方向是否可走for (int i = 0; i < 4; i++){//若沿此方向走合法if (!OutMap(p1 + people[i][0], p2 + people[i][1])){//若沿此方向走到达位置与箱子位置重合if (p1 + people[i][0] == x1 && p2 + people[i][1] == x2){//若往此方向推进箱子合法if (!OutMap(x1 + people[i][0], x2 + people[i][1])){//若此方向(箱子位置改变)到达位置没有走过if (!jmap[p1 + people[i][0]][p2 + people[i][1]][x1 + people[i][0]][x2 + people[i][1]])   {//标记走过jmap[p1 + people[i][0]][p2 + people[i][1]][x1 + people[i][0]][x2 + people[i][1]] = 1;//如果到达终点得到返回值1则将这一操作存进字符串并回溯liu = venture(p1 + people[i][0], p2 + people[i][1], x1 + people[i][0], x2 + people[i][1]);if (liu == 1){road[k++] = vroad[i];liu = 0;return 1;}}}}//若沿此方向走到达位置与箱子位置没有重合else{//若此方向(箱子位置没有改变)到达位置没有走过if (!jmap[p1 + people[i][0]][p2 + people[i][1]][x1][x2])     {//标记走过jmap[p1 + people[i][0]][p2 + people[i][1]][x1][x2] = 1;liu = venture(p1 + people[i][0], p2 + people[i][1], x1, x2);//如果到达终点得到返回值1则将这一操作存进字符串并回溯if (liu == 1){road[k++] = vroad[i];liu = 0;return 1;}}}}}//没有到达终点return 0;
}//主函数
int main()
{//输入地图大小cin >> n >> m;//输入地图元素并标记起点、终点以及箱子的位置for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){//地图元素cin >> zmap[i][j];     //终点if (zmap[i][j] == '@')    {n1 = i;m1 = j;}//起点if (zmap[i][j] == 'X')     {n2 = i;m2 = j;}//箱子位置if (zmap[i][j] == '*')     {n3 = i;m3 = j;}}int p1 = n2, p2 = m2, x1 = n3, x2 = m3;venture(p1, p2, x1, x2);road[k] = '\0';//无法到达终点if (k == 0)cout << "-1";//到达终点输出操作else{for (int i = k - 1; i >= 0; i--)printf("%c", road[i]);}
}

推箱子游戏—深度优先探索版本相关推荐

  1. [转]使用Away3D引擎的Flash3D推箱子游戏原型 - 最终版本

    http://bbs.9ria.com/viewthread.php?tid=76326&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bf ...

  2. 基于java的推箱子游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的推箱子游戏设计与实现 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让 ...

  3. 推箱子游戏设计与实现(Java+swing+JAWT)

    目 录 摘 要 i Abstract ii 引 言 1 1 系统分析 2 1.1 技术可行性分析 2 1.1.1 可行性目的 2 1.1.2 可行性研究前提 2 1.1.3 算法可行性分析 2 1.1 ...

  4. greenfoot推箱子游戏_推箱子小游戏V2.0更新

    小游戏实践 推箱子V2.0 大家好,我是努力学习争取成为优秀的Game Producer的路人猿,我们上期一起学习制作推箱子的简易V1.0版本,学习了如何响应用户的输入以及面对箱子的各种情况,今天我们 ...

  5. 【猿码】java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程可做为Java毕设大作业

    大家好,今天给大家演示一下由Java swing实现的推箱子小游戏的一款项目,其图标用的是喜羊羊与灰太狼,所以又称喜羊羊与灰太狼版的推箱子游戏,该项目运行环境为普通的Java环境,jdk版本不限,下面 ...

  6. 喜羊羊与灰太狼java_java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程...

    <p style="font-family:" font-size:15px;text-indent:2em;color:#555555;background-color:# ...

  7. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

  8. 推箱子android课程设计,推箱子游戏课程设计精选.doc

    推箱子游戏课程设计精选 目 录 Ⅰ 摘要 Ⅱ 前言 Ⅲ 功能描述 Ⅳ 配置要求 Ⅴ 总体设计 一.功能模块设计 二.数据结构设计 三.函数功能描述 四.代码实现 Ⅵ 参考文献 Ⅰ 摘 要 推箱子游戏是 ...

  9. Android开发入门——推箱子游戏开发实战(十二)

    绘制游戏局面 本文是推箱子游戏程序开发的第七步.系列文章前五篇描述准备工作,故本文编号是(十二).本文讲解如何绘制游戏局面. 本文目标 本文讲解如何绘制游戏局面.游戏局面的示例如图1,图2所示.这两幅 ...

最新文章

  1. 档案用虚拟化服务器还是物理机,利用虚拟化将一台NAS满足不同部门
  2. String是一个很普通的类 - Java那些事儿
  3. MySQL的Limit详解(转载)
  4. LOJ2195 旅行
  5. Mysql InnoDB Plugin安装 install
  6. mybatis plus 批量保存_mybatis源码分析
  7. 小米净水器压力传感器_净水器中RO的完整形式是什么?
  8. 导师要让你学会的“显规则”
  9. 中小学python、人工智能书籍(2022.02.02)
  10. 《R语言数据分析与挖掘实战》——3.2 数据特征分析
  11. 【Flink】Flink 写入 kafka 报错 Failed to send data to Kafka: Expiring 4 record(s) for 20001 ms has passed
  12. 关于svn的安装配置开启服务过程和 eclipse安装SVN插件的方法
  13. rms | 如何绘制模型带置信区间的预测曲线
  14. 大数据之-入门_Hadoop发展历史---大数据之hadoop工作笔记0009
  15. idea 主题文字大小修改
  16. 高中物理知识补充——电容电感充放电极性判断
  17. esxi install DS3615XS
  18. 固态硬盘分为哪几种_固态硬盘接口类型有哪些? 固态硬盘接口类型图解
  19. 拼多多商家使用拼多多上传图片尺寸软件教程
  20. 新一代奔驰C级车型内饰大改动,预计2021年才会亮相?

热门文章

  1. TEXTBOX中的换行
  2. 基于CarSim和Simulink的车辆预瞄轨迹跟踪控制 模型+carsim设置文件
  3. 英飞凌 AURIX 系列单片机的HSM详解(5)——HSM硬件加速模块的使用
  4. 一天连续两场活动,唐胡子俱乐部的魅力是什么?
  5. 男生的不主动,会让女生很失望
  6. swift URL 编码
  7. 在SQL server中设置表的自动编号功能
  8. Result和uniqueResult的方法
  9. 叹服,阿里自述 SpringCloud 微服务:入门 + 实战 + 案例,一网打尽
  10. linux两个内核切换,用kexec迅速切换内核 | LinuxSir.Org