推箱子小游戏《格鲁的实验室》13关 - bfs最短路径
下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路。
游戏的目标是把小黄人推到黄色球,小绿人推到绿色球,有个限制是,小黄/绿人运动时会沿某一个方向一直走直到遇到边界或者障碍物,如果途中遇到传送带还会改变运动方向。

-------------------------------------------------------------------------------------------------------------------------------
每个状态转移的时候有4*2个选择。标记已经访问过的状态就好了。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> Coord;
struct Status{
Coord y,g;
int step,fid,id;
Status(const Coord& y,const Coord& g,int step=0):y(y),g(g),step(step){fid = -1; id = 0;}
const Status& setId(int id,int fid){
this->id = id;
this->fid = fid;
return *this;
}
bool operator<(const Status& another) const { return step>another.step; }
int hash(){ return y.first*1000+y.second*100+g.first*10+g.second; } friend ostream& operator<<(ostream& out,const Status& s){
return (out<<"yellow("<<s.y.first<<","<<s.y.second<<") green("<<s.g.first<<","<<s.g.second<<") step:"<<s.step);
}
};
Coord Y = {0,3};
Coord G = {5,2};
const int M = 6;
const int N = 8;
const int skip[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
bool vis[6868];
bool cango(int& x,int& y,int& dir,const Coord& another){
int tx = x + skip[dir][0];
int ty = y + skip[dir][1];
if(tx<0||ty<0||tx>=M||ty>=N) return false;
if(tx==another.first&&ty==another.second) return false;
x = tx,y = ty;
if(x==3&&y==2) dir=1;
if(x==4&&y==3) dir=0;
return true;
}
bool mov(Coord &a,const Coord& b,int dir){
int len = 0;
while(cango(a.first,a.second,dir,b)) len++;
return len>0;
}
//for print path
vector<Status> trace;
void print(const Status& node){
if(node.fid==-1){
std::cout<<node<<endl; return ;
}
print(trace[node.fid]);
std::cout<<node<<endl;
} int main(){
Coord y = {0,5};
Coord g = {0,6};
Status start(y,g);
memset(vis,false,sizeof(vis)); priority_queue<Status> q;
q.push(start);
vis[start.hash()] = true;
trace.push_back(start);
while(q.size()){
Status cur = q.top(); q.pop();
if(cur.g==G&&cur.y==Y){
printf("step: %d\n",cur.step);
print(cur);
break;
}
for(int i=0;i<4;i++){
Coord tmpy = cur.y;
Coord tmpg = cur.g;
if(mov(tmpy,cur.g,i)) {
Status next(tmpy,cur.g,cur.step+1);
if(!vis[next.hash()]){
trace.push_back(next.setId(trace.size(),cur.id));
q.push(next);
vis[next.hash()]=true;
}
}
if(mov(tmpg,cur.y,i)){
Status next(cur.y,tmpg,cur.step+1);
if(!vis[next.hash()]){
trace.push_back(next.setId(trace.size(),cur.id));
q.push(next);
vis[next.hash()]=true;
}
}
}
}
return 0;
}
推箱子小游戏《格鲁的实验室》13关 - bfs最短路径的更多相关文章
- 完整版本的推箱子小游戏,最简单的纯C语言打造
/* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...
- C++ 控制台推箱子小游戏
// 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 用C#制作推箱子小游戏
思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图 (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...
- c++、c实现推箱子小游戏
经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...
- 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...
- 【loj-1055-Going Together-三个棋子推箱子走到目的地--讲预判的bfs】
light oj 1055-Going Together 题目大致意思: 简单的三个棋子,每次可以下达一个命令,robots全部按照指令进行前进:若下一步不为空地则停留在原地. 特殊考虑: 1.例如A ...
- C语言小游戏: 推箱子 支线(一)--1
好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...
随机推荐
- C#.NET编码规范
一. 环境设置 首先去除开发环境中的一些选项如下: 图一 图二 二. 命名规范 1) 通用性 l 标识的总长度不要超过32个字符. l 标识符的基本语法是以字母和_开始,由字母数字及下划线组成的单词 ...
- 【转】C# ABP WebApi与Swagger UI的集成
以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用. 最近新入职,公司里 ...
- Web api 测试 工具WebApiTestClient
1.打开Nuget 安装 WebApiTestClient 2.在HelpPageConfig.cs 里面添加这段文字 config.SetDocumentationProvider(new Xml ...
- python中set集合的使用
集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. python 的集合类型和 其他语言类似, 是一个无序不重复元素集 基本功能包括关系测试和消除重复元素.集合对象还支持un ...
- css元素垂直居中方法
1.Line-height 适用情景:单行文字垂直居中技巧 这个方式应该是最多人知道的了,常见于单行文字的应用,像是按钮这一类对象,或者是下拉框.导航此类元素最常见到的方式了.此方式的原理是在于将单行 ...
- 使用CocoaPods更新第三方库出错的解决办法
使用CocoaPods更新第三方库出错的解决办法 执行完pod install或pod update之后,控制台抛出以下警告信息: [!] The xx [Debug] target override ...
- AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中?
AVL树: 最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间的管理用到了AVL树. 红黑树: 平衡二叉树,广泛用在C++的STL中.如map和set都是用红黑树实现的. ...
- performSelector与objc_msgSend
- perform:(SEL)aSelector { if (aSelector) return objc_msgSend(self, aSelector); else return [self er ...
- Debian下的内核编译
如果你装了一台linux的机器,自己没有重新编译内核,那这台机器的效率就大打折扣了,因为默认安装的机器会生成许多不需要的东西,在启动的时候也会比较慢,而你要用的有些东西可能不能工作,比如,现在都把IP ...
- day05-1 执行Python程序的两种方式
目录 执行Python程序的两种方式 第一种:交互式 第二种:命令行式 三个步骤 两种方式的区别 执行Python程序的两种方式 第一种:交互式 在cmd中运行 优点:直接给出结果,执行效率高,及时报 ...