下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路。

游戏的目标是把小黄人推到黄色球,小绿人推到绿色球,有个限制是,小黄/绿人运动时会沿某一个方向一直走直到遇到边界或者障碍物,如果途中遇到传送带还会改变运动方向。

-------------------------------------------------------------------------------------------------------------------------------

每个状态转移的时候有4*2个选择。标记已经访问过的状态就好了。

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef pair<int,int> Coord;
  8. struct Status{
  9. Coord y,g;
  10. int step,fid,id;
  11. Status(const Coord& y,const Coord& g,int step=0):y(y),g(g),step(step){fid = -1; id = 0;}
  12. const Status& setId(int id,int fid){
  13. this->id = id;
  14. this->fid = fid;
  15. return *this;
  16. }
  17. bool operator<(const Status& another) const { return step>another.step; }
  18. int hash(){ return y.first*1000+y.second*100+g.first*10+g.second; }
  19.  
  20. friend ostream& operator<<(ostream& out,const Status& s){
  21. return (out<<"yellow("<<s.y.first<<","<<s.y.second<<") green("<<s.g.first<<","<<s.g.second<<") step:"<<s.step);
  22. }
  23. };
  24. Coord Y = {0,3};
  25. Coord G = {5,2};
  26. const int M = 6;
  27. const int N = 8;
  28. const int skip[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
  29. bool vis[6868];
  30. bool cango(int& x,int& y,int& dir,const Coord& another){
  31. int tx = x + skip[dir][0];
  32. int ty = y + skip[dir][1];
  33. if(tx<0||ty<0||tx>=M||ty>=N) return false;
  34. if(tx==another.first&&ty==another.second) return false;
  35. x = tx,y = ty;
  36. if(x==3&&y==2) dir=1;
  37. if(x==4&&y==3) dir=0;
  38. return true;
  39. }
  40. bool mov(Coord &a,const Coord& b,int dir){
  41. int len = 0;
  42. while(cango(a.first,a.second,dir,b)) len++;
  43. return len>0;
  44. }
  45. //for print path
  46. vector<Status> trace;
  47. void print(const Status& node){
  48. if(node.fid==-1){
  49. std::cout<<node<<endl; return ;
  50. }
  51. print(trace[node.fid]);
  52. std::cout<<node<<endl;
  53. }
  54.  
  55. int main(){
  56. Coord y = {0,5};
  57. Coord g = {0,6};
  58. Status start(y,g);
  59. memset(vis,false,sizeof(vis));
  60.  
  61. priority_queue<Status> q;
  62. q.push(start);
  63. vis[start.hash()] = true;
  64. trace.push_back(start);
  65. while(q.size()){
  66. Status cur = q.top(); q.pop();
  67. if(cur.g==G&&cur.y==Y){
  68. printf("step: %d\n",cur.step);
  69. print(cur);
  70. break;
  71. }
  72. for(int i=0;i<4;i++){
  73. Coord tmpy = cur.y;
  74. Coord tmpg = cur.g;
  75. if(mov(tmpy,cur.g,i)) {
  76. Status next(tmpy,cur.g,cur.step+1);
  77. if(!vis[next.hash()]){
  78. trace.push_back(next.setId(trace.size(),cur.id));
  79. q.push(next);
  80. vis[next.hash()]=true;
  81. }
  82. }
  83. if(mov(tmpg,cur.y,i)){
  84. Status next(cur.y,tmpg,cur.step+1);
  85. if(!vis[next.hash()]){
  86. trace.push_back(next.setId(trace.size(),cur.id));
  87. q.push(next);
  88. vis[next.hash()]=true;
  89. }
  90. }
  91. }
  92. }
  93. return 0;
  94. }

推箱子小游戏《格鲁的实验室》13关 - bfs最短路径的更多相关文章

  1. 完整版本的推箱子小游戏,最简单的纯C语言打造

    /* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...

  2. C++ 控制台推箱子小游戏

              // 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...

  3. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  4. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  5. 用C#制作推箱子小游戏

    思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图  (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...

  6. c++、c实现推箱子小游戏

    经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...

  7. 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...

  8. 【loj-1055-Going Together-三个棋子推箱子走到目的地--讲预判的bfs】

    light oj 1055-Going Together 题目大致意思: 简单的三个棋子,每次可以下达一个命令,robots全部按照指令进行前进:若下一步不为空地则停留在原地. 特殊考虑: 1.例如A ...

  9. C语言小游戏: 推箱子 支线(一)--1

    好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...

随机推荐

  1. dp入门(先摆在这里,之后细细读)

    网址转载链接:  http://bbs.chinaunix.net/thread-4094539-1-1.html 动态规划:从新手到专家 Hawstein翻译 前言 我们遇到的问题中,有很大一部分可 ...

  2. 用私有构造器或枚举类型强化Singleton

    Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...

  3. Oracle查询优化之减少统计的数据量

    统计各部门人数很简单,通过部门分组即可,要统计部门以下下级部门的人数也简单,通过递归.要统计所有有下级部门的部门人数(包含下级)页比较简单, 先查询出有下级的部门,在对每个部门进行递归查询,如下: ) ...

  4. sed将上下两行并列

    #cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344

  5. Vue轮播图插件---Vue-Awesome-Swiper

    轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...

  6. 字符串中连续出现最多的子串 &amp; 字符串中最长反复子串

    字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...

  7. Android程序之全国天气预报查询(聚合数据开发)

    一.项目演示效果例如以下: 项目源码下载地址: http://pan.baidu.com/s/1pL6o5Mb password:5myq 二.使用 聚合数据SDK: (1)聚合数据官网地址:http ...

  8. I hate it (线段树)

    B - I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  9. 数据挖掘算法学习(四)PCA算法

    转载请附上链接http://blog.csdn.net/iemyxie/article/details/38236647 算法简单介绍 主成分分析(PrincipalComponentAnalysis ...

  10. (三 )kafka-jstorm集群实时日志分析 之 ---------jstorm集成spring 续(代码)

    本地模式启动的. package com.doctor.kafkajstrom; import java.util.HashMap; import java.util.Map; import java ...