中文题目: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. Android实现异步处理 -- HTTP请求

    原帖:http://www.cnblogs.com/answer1991/archive/2012/04/22/2464524.html Android操作UI的方法不是线程安全的,也就是说开发者自己 ...

  2. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略

    先把上节未完毕的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法能够列出一 ...

  3. 网络授时服务 NTP

    NTP  --- Network Time Protocol 网络授时服务,他解决的主要问题就是实现两台或者多台机器的时间同步问题,而传统的格林尼治时间不是标准的时间,因为地球自转的不是规则的. 网络 ...

  4. Java --CountDownLatch简介

    CountDownLatch 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数 初始化 CountDownLatch.由于调用了 coun ...

  5. poj 2891 Strange Way to Express Integers(中国剩余定理)

    http://poj.org/problem?id=2891 题意:求解一个数x使得 x%8 = 7,x%11 = 9; 若x存在,输出最小整数解.否则输出-1: ps: 思路:这不是简单的中国剩余定 ...

  6. 使Web Api 支持跨域资源共享(CORS)

    Reference:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api Imp ...

  7. Opera浏览器测试移动端网站和模拟手机浏览器的方法

    链接地址:http://www.neirong.org/post-256.html?utm_source=tuicool Chrome浏览器请看:Chrome浏览器测试移动端网站和模拟手机浏览器的方法 ...

  8. leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  9. Bandwidth内存带宽測试工具

    本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/24766015 ----------------- ...

  10. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...