中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254
一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断。
可以使用两个BFS,人这里也可以DFS。看见别人有用四维标记的有用图中图的判重,我也用一下图中图好了。 #include<iostream>
#include<queue>
using namespace std; int n, m;
int map[10][10];
int vec[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}};
int visited[10][10][4];//标记箱子。有四个方向,所有一个点可以推四次
int visitedP[10][10];//标记人 struct node
{
int x;
int y;
int step;
int innerMap[10][10];//保存每个点修改的图
bool check()
{
if(x>=0 && x<n && y>=0 && y<m)
return true;
return false;
}
}boxStart, peopleStart, peopleEnd, target; int PeopleBFS(node t)
{
peopleStart = t;
memset(visitedP, 0, sizeof(visitedP)); queue<node> Q;
//找人的位置
for (int i = 0; i<n; i++)
{
for (int j = 0; j<m; j++)
{
if (t.innerMap[i][j] == 4)
{
peopleStart.x = i;
peopleStart.y = j;
peopleStart.step = 0;
}
}
}
if(peopleStart.x == peopleEnd.x && peopleStart.y == peopleEnd.y)
return true;
visitedP[peopleStart.x][peopleStart.y] = true; Q.push(peopleStart);
while (!Q.empty())
{
node q = Q.front();
Q.pop();
for (int i = 0; i<4; i++)
{
node p = q;
p.x += vec[i][0];
p.y += vec[i][1];
p.step++;
if (p.check() && !visitedP[p.x][p.y] && t.innerMap[p.x][p.y]!=1
&& t.innerMap[p.x][p.y]!= 2)//不是墙不是箱
{
visitedP[p.x][p.y] = true;
if (p.x == peopleEnd.x && p.y == peopleEnd.y)//可以到
{
return true;
}
Q.push(p);
}
}
}
return false;
} int BoxBFS()
{
queue<node> Q;
Q.push(boxStart);
while (!Q.empty())
{
node q = Q.front();
Q.pop();
for (int i = 0; i<4; i++)
{
node p = q;
p.x += vec[i][0];
p.y += vec[i][1];
p.step++;
if (p.check() && !visited[p.x][p.y][i] && map[p.x][p.y] != 1)
{
//找出人站在箱子前进方向的反方向
peopleEnd = q;
peopleEnd.x = q.x - vec[i][0];
peopleEnd.y = q.y - vec[i][1];
if (peopleEnd.check())//人可以站在这个位置
{
if (PeopleBFS(peopleEnd))//人可以到达 {
swap(p.innerMap[p.x][p.y], p.innerMap[q.x][q.y]);//箱子走一步
swap(p.innerMap[peopleEnd.x][peopleEnd.y],
p.innerMap[peopleStart.x][peopleStart.y]);//人跟上
visited[p.x][p.y][i] = true;
if (map[p.x][p.y] == 3)//到达目的地
{
return p.step;
}
Q.push(p); }
}
}
}
}
return -1;
} int main()
{
int T;
cin>>T;
while (T--)
{
cin>>n>>m;
memset(visited, 0, sizeof(visited));
for (int i = 0; i<n; i++)
{
for (int j = 0; j<m; j++)
{
cin>>map[i][j];
boxStart.innerMap[i][j] = map[i][j];
if (map[i][j] == 2)//箱子起始
{
boxStart.x = i;
boxStart.y = j;
boxStart.step = 0;
}
}
}
cout<<BoxBFS()<<endl;
}
return 0;
}

HDU 1254 推箱子游戏(搞了一下午。。。)的更多相关文章

  1. HDU 1254 推箱子(BFS加优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  3. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  4. hdu - 1254 推箱子 (bfs+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...

  5. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  6. [HDU 1254] 推箱子

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  7. HDU 1254 推箱子(BFS)

    Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...

  8. hdu 1254 推箱子(双重bfs)

    题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...

  9. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. C# 客户端服务端的编写

    客户端的代码 class client { public void mehod() { TcpClient tcp = new TcpClient(); tcp.Connect(IPAddress.P ...

  2. C++ 中mallon动态分配内存大小用法

    #include<iostream> using namespace std; int main(){ char *s; int n; cin>>n; s= (char *) ...

  3. 使用SHA1、SHA2双证书进行微软数字签名

    微软是第一个宣布了SHA-1弃用计划,在2016年之后Windows和IE将不再信任SHA-1证书.正好我们公司的数字签名也到期了,索性就重新申请了sha256和sha1的新数字证书,用来给产品签名. ...

  4. Jquery学习笔记:操作form表单元素之一(文本框和下拉框)

    一.概述 在web页面开发中,经常需要获取和设置表单元素的值(如文本框中的内容),特别是在ajax应用中,更是常态.本文系统的介绍下如何操作. 同操作其它html元素一样,操作的过程差不多. 第一步, ...

  5. NOI08冬令营 数据结构的提炼与压缩

    无聊随手翻,翻到了一个这样的好东西--据结构的提炼与压缩: 为了防止以后忘记,这里把论文里的题目都纪录一下吧. 1.二维结构的化简 问题一:ural 1568 Train car sorting 定义 ...

  6. container_of用法及实现

    container_of 有的情况下,只知道 struct结构中莫个成员的指针,而需要知道整个struct的指针 (如网卡驱动里面,list) struct DDD {         int a; ...

  7. 【每日一摩斯】-Troubleshooting: High CPU Utilization (164768.1) - 系列5

    Oracle(用户)进程 以下这些操作都是需要消耗大量CPU资源的:解析大型查询,存储过程编译或执行,空间管理和排序. 下面这几篇文章可以帮助采集关于使用高CPU资源的进程的更多信息: Note:35 ...

  8. fzu 1913 Easy Comparison(字符串)

    题目链接:fzu 1913 Easy Comparison 题目大意:给出一个字符串,计算与它按照字典序排序排列后的字符串有多少个位置不同. 解题思路:水体,sort一下,然后遍历一遍就好. #inc ...

  9. vc怎么去掉烦人的“驱动器未准备好”错误

    在我们写程序的时候,如果访问一个软驱中没有软盘或者光驱中没有cd的时候,windows总是弹出一个恼人的错误框说“驱动器未准备好” 其实我们可以通过如下的步骤禁止这个错误框的弹出 一.用SetErro ...

  10. Qt Creator键盘快捷键速查

    原地址:http://bbs.qter.org/forum.php?mod=viewthread&tid=904&extra=page%3D2 一般操作的键盘快捷键 操作 快捷键 操作 ...