推箱子小游戏《格鲁的实验室》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.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...
随机推荐
- dp入门(先摆在这里,之后细细读)
网址转载链接: http://bbs.chinaunix.net/thread-4094539-1-1.html 动态规划:从新手到专家 Hawstein翻译 前言 我们遇到的问题中,有很大一部分可 ...
- 用私有构造器或枚举类型强化Singleton
Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设 ...
- Oracle查询优化之减少统计的数据量
统计各部门人数很简单,通过部门分组即可,要统计部门以下下级部门的人数也简单,通过递归.要统计所有有下级部门的部门人数(包含下级)页比较简单, 先查询出有下级的部门,在对每个部门进行递归查询,如下: ) ...
- sed将上下两行并列
#cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344
- Vue轮播图插件---Vue-Awesome-Swiper
轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...
- 字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...
- Android程序之全国天气预报查询(聚合数据开发)
一.项目演示效果例如以下: 项目源码下载地址: http://pan.baidu.com/s/1pL6o5Mb password:5myq 二.使用 聚合数据SDK: (1)聚合数据官网地址:http ...
- I hate it (线段树)
B - I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- 数据挖掘算法学习(四)PCA算法
转载请附上链接http://blog.csdn.net/iemyxie/article/details/38236647 算法简单介绍 主成分分析(PrincipalComponentAnalysis ...
- (三 )kafka-jstorm集群实时日志分析 之 ---------jstorm集成spring 续(代码)
本地模式启动的. package com.doctor.kafkajstrom; import java.util.HashMap; import java.util.Map; import java ...