POJ3322滚箱子游戏(不错)
题意:
讲的是一个游戏,就是在一个平面上滚动一个1*1*2的长方体的游戏,在本题里面的游戏规则是这样的:
(1)
一开始给你箱子的状态,可能是横着也可能是竖着。
(2)
每一次可以滚动箱子,但是每次滚动到的位置(1个或者2个)都必须不能是空的。
(3)
有的位置只能经得起箱子一半的重量,有的能经得起真个箱子的重量,经得起一半的格子意思就是不能在当前的这个格子上吧箱子竖起来。
(4)然后问从起始状态到掉到终点给的洞里面的最小步数,掉到洞里面的时候必须是竖直掉下去的。
思路:
比较明显可以用搜索来做,但是这个题目的关键点是如何标记状态,我的做法是对于每一个点都有五个状态,就是另一个点相对于这个点的位置,可以是东南西北,还有正上方
,标记的时候是这样的依靠五个状态,搜索的时候为了简化代码我写的是3个状态的,因为有一些等效状态,我们只要搜索其中的一个就行了,但是如果你愿意把所有的状态都写出来,那么一共是5种,每种有四个方向的走法一共是5*4种选择,这样代码量估计比较大,如果是相等状态只进一个的话可以达到3*4种选择,但是这样的话要注意就是在mark的时候的一些细节,别的没啥的就是简单广搜,姿势好点应该没啥大问题,具体细节可以看下面代码。
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
int x ,y ,t ,k;
}NODE;
NODE xin ,tou;
int map[505][505] ,n ,m;
int mark[505][505][5];
int ex ,ey;
bool ok(int x ,int y ,int k)
{
return x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] && !mark[x][y][k];
}
int BFS()
{
queue<NODE>q;
q.push(xin);
memset(mark ,0 ,sizeof(mark));
mark[xin.x][xin.y][xin.k] = 1;
NODE X1 ,X2;
while(!q.empty())
{
tou = q.front();
q.pop();
//printf("%d %d %d %d**\n" ,tou.x ,tou.y ,tou.k ,tou.t);
if(!tou.k && tou.x == ex && tou.y == ey)
return tou.t;
if(tou.k == 0)
{
//上
X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 1;
X2.x = tou.x - 2 ,X2.y = tou.y ,X2.k = 3;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
//下
X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 3;
X2.x = tou.x + 2 ,X2.y = tou.y ,X2.k = 1;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X2.t = tou.t + 1;
q.push(X2);
}
//左
X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 4;
X2.x = tou.x ,X2.y = tou.y - 2 ,X2.k = 2;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
//右
X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 2;
X2.x = tou.x ,X2.y = tou.y + 2 ,X2.k = 4;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X2.t = tou.t + 1;
q.push(X2);
}
}
else if(tou.k == 1)
{
//上
X1.x = tou.x - 2 ,X1.y = tou.y ,X1.k = 0;
if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
{
X1.t = tou.t + 1;
mark[X1.x][X1.y][X1.k] = 1;
q.push(X1);
}
//下
X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 0;
if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
{
X1.t = tou.t + 1;
mark[X1.x][X1.y][X1.k] = 1;
q.push(X1);
}
//左
X1.x = tou.x ,X1.y = tou.y - 1 ,X1.k = 1;
X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 3;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
//右
X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 1;
X2.x = tou.x - 1 ,X2.y = tou.y + 1 ,X2.k = 3;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
}
else if(tou.k == 4)
{
//上
X1.x = tou.x - 1 ,X1.y = tou.y ,X1.k = 4;
X2.x = tou.x - 1 ,X2.y = tou.y - 1 ,X2.k = 2;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
//下
X1.x = tou.x + 1 ,X1.y = tou.y ,X1.k = 4;
X2.x = tou.x + 1 ,X2.y = tou.y - 1 ,X2.k = 2;
if(ok(X1.x ,X1.y ,X1.k) && ok(X2.x ,X2.y ,X2.k))
{
mark[X1.x][X1.y][X1.k] = mark[X2.x][X2.y][X2.k] = 1;
X1.t = tou.t + 1;
q.push(X1);
}
//左
X1.x = tou.x ,X1.y = tou.y - 2 ,X1.k = 0;
if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
{
X1.t = tou.t + 1;
mark[X1.x][X1.y][X1.k] = 1;
q.push(X1);
}
//右
X1.x = tou.x ,X1.y = tou.y + 1 ,X1.k = 0;
if(ok(X1.x ,X1.y ,X1.k) && map[X1.x][X1.y] == 1)
{
X1.t = tou.t + 1;
mark[X1.x][X1.y][X1.k] = 1;
q.push(X1);
}
}
}
return -1;
}
int main ()
{
char str[505];
int sx1 ,sx2 ,sy1 ,sy2 ,s;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
s = 0;
for(int i = 1 ;i <= n ;i ++)
{
scanf("%s" ,str);
for(int j = 1 ;j <= m ;j ++)
{
if(str[j-1] == 'X')
{
s ++;
if(s == 1) sx1 = i ,sy1 = j;
else sx2 = i ,sy2 = j;
map[i][j] = 1;
}
else if(str[j-1] == 'O')
{
ex = i ,ey = j;
map[i][j] = 1;
}
else if(str[j-1] == 'E') map[i][j] = 2;
else if(str[j-1] == '#') map[i][j] = 0;
else map[i][j] = 1;
}
}
if(s == 1) xin.x = sx1 ,xin.y = sy1 ,xin.k = 0 ,xin.t = 0;
else
{
if(sx1 == sx2) xin.x = sx2 ,xin.y = sy2 ,xin.k = 4 ,xin.t = 0;
else xin.x = xin.x = sx2 ,xin.y = sy2 ,xin.k = 1 ,xin.t = 0;
}
int ans = BFS();
ans == -1 ? printf("Impossible\n") : printf("%d\n" ,ans);
}
return 0;
}
POJ3322滚箱子游戏(不错)的更多相关文章
- Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏
一.预备知识—对象的”生“与”死“ (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive() 以上一篇的博文中的“指 ...
- JavaScript写一个小乌龟推箱子游戏
推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...
- 用HTML5+原生js实现的推箱子游戏
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C# 推箱子游戏&对战游戏
推箱子游戏提纲,只有向右向上的操作,向左向下同理,后期需完善. namespace 推箱子 { class Program { static void Main(string[] args) { // ...
- C++学习(九)(C语言部分)之 项目 推箱子游戏
游戏制作 推箱子 步骤分析 1.模板 2.模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3.如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4. ...
- 【CCpp程序设计2017】推箱子游戏
我的还……支持撤销!用链表实现! 题目:推箱子小游戏(基于console) 功能要求: 将p09迷宫游戏改造为“推箱子”游戏: 在地图中增加箱子.箱子目标位置等图形: 当玩家将所有箱子归位,则显示玩家 ...
- JavaScript 推箱子游戏
推箱子游戏的 逻辑非常简单,但是如果不动手的话,还是不太清楚.我在这里讲一下自己的思路. 制作推箱子,首先要有自己的设计素材.如下我也是网上找的素材 第二步,理清游戏的规则. 游戏规则: 1.小人将箱 ...
- three.js 制作一个三维的推箱子游戏
今天郭先生发现大家更喜欢看我发的three.js小作品,今天我就发一个3d版本推箱子的游戏,其实webGL有很多框架,three.js并不合适做游戏引擎,但是可以尝试一些小游戏.在线案例请点击博客原文 ...
- 用C写一个简单的推箱子游戏(二)
下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...
随机推荐
- [源码分析] 消息队列 Kombu 之 启动过程
[源码分析] 消息队列 Kombu 之 启动过程 0x00 摘要 本系列我们介绍消息队列 Kombu.Kombu 的定位是一个兼容 AMQP 协议的消息队列抽象.通过本文,大家可以了解 Kombu 是 ...
- $nextTick解决Vue组件卸载在加载合并的问题
情况是这样的,父子组件都是复选框,点击父组件的复选框,子组件的复选框要显示并全选,取消复选框,子组件隐藏.子组件显隐我用的 v-if ,使用created钩子函数来使子组件处于全选状态. 但是出现的问 ...
- 锐捷RG-UAC统一上网行为管理审计系统账号密码泄露漏洞 CNVD-2021-14536
一:产品介绍: 锐捷 RG-UAC 统一上网行为管理审计系统 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,以路由.透明.旁路或混合模式部署在网络的 ...
- Java多线程之线程
前言 线程作为现代操作系统调度的最小单元,多个线程能够同时执行,这将显著提高程序的性能,而且在当前多核CPU的环境下也能更好的利用资源.Java提供了对多线程的良好支持.线程是多线程的基础. 使用多线 ...
- Sentinel高级
Sentinel高级 sentinel和springCloud整合 减少开发的复杂度,对大部分的主流框架,例如:Web Servlet.Dubbo.Spring Cloud.gRPC.Spring W ...
- 【odoo14】第十八章、自动化测试
当我们开发大型应用的时候,通过自动化测试可以大幅提高应用的健壮性.每年,odoo都会发布新版本,自动化测试对于应用的回归测试非常有帮助.幸运的是,odoo框架有不同自动化测试用例.odoo主要包括三种 ...
- 【python+selenium的web自动化】- PageObject模式解析及案例
如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html PO模式 Page O ...
- Stone Game, Why are you always there? HDU - 2999
题目链接:https://vjudge.net/problem/HDU-2999 题意:有N堆石头,两个人交替取,每次只能取连续的k个石子,最后没有石子取得人输. 思路:如果我们每次取靠边的k个,那么 ...
- Java中的IO流 - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...
- python基础(十):集合的使用(上)
集合的作用 去重:把一个列表变成集合,就自动去重了. 关系测试:测试两组数据之前的交集.差集.并集等关系. 集合的特征 集合使用 set 表示: 集合也使用{ }表示, 与字典不同的是:字典中存储的是 ...