HDU 1254 推箱子 BFS
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1254
题目分析:
做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊!
思路:
1.标记人的位置 和 箱子的位置两个动态坐标 来判断是否这个状态出现过, 但是有一点要, 虽然人和箱子同时出现了重复状态 但是还有一个状态需要考虑,就是推箱子的步数,
虽然到达了同样的地点但是,步数不一样也是不一样的状态。下面会有个数据可以观察一下。
2.结构体里保存 人的坐标, 箱子的坐标, 推箱子的步数
3(1).每次人走一步,判断这一步是否合法, 然后判断人是否与箱子重合, 如果与箱子重合了, 则箱子再向前一步,判断箱子的状态是否合法!如果合法加入队列。
(2)如果箱子和人不重合,并且人和箱子的状态合法!则加入队列。
下面是代码:
#include <iostream>
#include <vector>
#include <stack>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
#define maxn 10
#define INF 0xfffffff
#define min(a,b) (a<b?a:b)
struct Point
{
int x, y;//人的坐标
int nx, ny;//箱子的坐标
int step;
} Ps;
int dir[][] = { {,},{,-},{-,},{,} };
int maps[maxn][maxn];
int vis[maxn][maxn][maxn][maxn];//人的坐标,,,箱子的坐标
int m, n; bool OK(Point P)
{
return P.x >= && P.x < m && P.y >= && P.y < n && maps[P.x][P.y] != && P.step < vis[P.x][P.y][P.nx][P.ny];
} bool OK2(Point P)
{
return P.nx >= && P.nx < m && P.ny >= && P.ny < n && maps[P.nx][P.ny] != && P.step < vis[P.x][P.y][P.nx][P.ny];
}
void init()
{
for(int i=; i<maxn; i++)
for(int j=; j<maxn; j++)
for(int k=; k<maxn; k++)
for(int p=; p<maxn; p++)
vis[i][j][k][p] = INF;
}
int BFS()
{
Point P, Pn;
queue<Point> Q;
Q.push(Ps);
int ans = INF; vis[Ps.x][Ps.y][Ps.nx][Ps.ny] = true; while( !Q.empty() )
{
P = Q.front();
Q.pop(); if(maps[P.nx][P.ny] == )
{
ans = min(ans,P.step);
} for(int i=; i<; i++)
{
Pn = P;//人向前走一步
Pn.x += dir[i][];
Pn.y += dir[i][];
if( OK(Pn) )//判断人走一步是否合法
{
if( Pn.x == Pn.nx && Pn.y == Pn.ny)//如果人和箱子重合则箱子向前进一步
{
Pn.nx += dir[i][];
Pn.ny += dir[i][];
Pn.step ++;
if( OK2(Pn))//判断箱子前进是否合法
{
vis[Pn.x][Pn.y][Pn.nx][Pn.ny] = Pn.step;
Q.push(Pn);
}
}
else
{
vis[Pn.x][Pn.y][Pn.nx][Pn.ny] = Pn.step;
Q.push(Pn);
}
}
}
}
return ans;
} int main()
{
int T, k;
scanf("%d",&T); while(T--)
{
init();//对VIS进行初始化 scanf("%d%d",&m,&n); for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
scanf("%d",&maps[i][j]);
if(maps[i][j] == )
Ps.x = i, Ps.y = j, Ps.step = ;
else if(maps[i][j] == )
Ps.nx = i, Ps.ny = j;
}
}
k = BFS();
if(k == INF)
k = -;
printf("%d\n", k);
}
return ;
}
HDU 1254 推箱子 BFS的更多相关文章
- hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1254 推箱子(搜索)
我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- [HDU 1254] 推箱子
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- 使用Listener准备application作用域数据
在程序中.有些数据我们希望在程序启动的时候就准备好,而且仅仅准备一次,放在application作用域中,这时候.我们一般会用Listener来准备这些数据. 可是,用Listener准备applic ...
- DLL程序的创建步骤和測试程序
首先,创建DLL程序 然后,加入一个导出类 比如: //Test.h #pragma once class AFX_EXT_CLASS Test { public: Test(void); ~Te ...
- 第十四章 红黑树——C++代码实现
红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树.红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键 ...
- 从零开始写一个Tomcat(叁)--请求解析
挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...
- Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...
- Java基础知识强化之集合框架笔记09:Collection集合迭代器使用的问题探讨
1.Collection集合迭代器使用的问题探讨: (1)问题1:能用while循环写这个程序,我能不能用for循环呢? 可以使用for循环替代. (2)问题2:不要 ...
- TCP/IP协议原理与应用笔记09:数据通信---封装
2016-08-091. 数据通信----封装: 2. 协议数据单元: PDU:对等层数据通信的单元. 比如Source端的应用层 和 Destination端的应用层是对等层(L7),这个时候L7 ...
- python 之路,Day11 (下)- sqlalchemy ORM
python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...
- python学习之成员信息增删改查
主要实现了成员信息的增加,修改,查询,和删除功能,写着玩玩,在写的过程中,遇到的问题,旧新成员信息数据的合并,手机号和邮箱的验证,#!/usr/bin/env python# coding=utf8# ...
- ueditor asp.net版本更改图片保存路径
目的:把本地上传的图片放置到跟目录下的Images/Upload文件夹下. 修改步骤: 1.ueditor.config.js文件中的, imagePath: URL + "net/&quo ...