中文题目: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. NanShan即时通讯论——HTML5的优势与劣势

    原文:NanShan即时通讯论--HTML5的优势与劣势 NanShan即时通讯 学习html时才是XHTML 1.0,接着是 HTML4.01,再到HTML5,如今HTML5 開始吸引越来越多的人的 ...

  2. mysql之数据类型

    一.概述:  所谓建表,就是声明列的过程: 数据是以文件的形式放在硬盘中(也有放在内存里的) 列:不同的列类型占的空间不一样 选列的原则:够用又不浪费: 二.mysql的数据类型: 整形:Tinyin ...

  3. Source Insight使用技巧

    1. source insight必设: option-->key assignments-->    Edit: Delete Line ---- Assign New Key: Ctr ...

  4. hdu 1282回文数猜想

    http://acm.hdu.edu.cn/showproblem.php?pid=1282 Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序 ...

  5. hibernate笔记(一)

    一.主配置文件hibernate.cfg.xml 位置:放在src目录下. 主要包含信息: 一.数据库信息    数据库方言(类的全名) 及 数据库链接信息 1.      数据库方言 2.      ...

  6. codility上的问题(26) Hydrogenium 2013

    题目,挺无聊的.一个裸的最短路.n个点,你住在0,要去买东西,每个点有一个关门时间,问能最早买到食物的时间.有两点注意 (1)有重边 (2) 原图是dicrect连接...但不是有向边,被这个误导了. ...

  7. PHP脚本监控程序

    #!/bin/sh # Find ip IP=`/sbin/ifconfig eth1 | grep 'inet addr' | awk '{ print substr($2, index($2, & ...

  8. Android中Drawable分类汇总(上)

    Android把可绘制的对象抽象为Drawable,不同的图形图像资源就代表着不同的drawable类型.Android FrameWork提供了一些具体的Drawable实现,通常在代码中都不会直接 ...

  9. Python 对Twitter中指定话题的被转载Tweet数量的频谱分析

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: r ...

  10. 【Unity 3D】使用 2DToolkit 插件 制作2D精灵动画

    话说博客传图也太麻烦了吧,一个一个文件一个一个传....为什么不能直接粘贴了,自动上传呢... 刚直接粘贴了,结果一张图没有,又重新截一次图,在传了一次...真是太**了 好了,吐槽完了,开始博客吧 ...