HDU1254:推箱子(bfs+dfs)
传送门
题意
给出一副图
0.空地1.墙2.箱子3.目的地4.人所在的位置
问最少几步能将箱子推到目的地
分析
这道题难度略大(菜鸡),首先用vis[bx][by][mx][my]记录当箱子(bx,by)和人(mx,my)是否被访问过,用一个bfs求出最短路,另外dfs判断人是否能够到达推箱子的位置,写起来比较复杂,(弱鸡)
trick
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int t,n,m,mp[10][10],bx,by,mx,my,prex,prey,flag,ans;
int dir[4][2]={0,1,-1,0,0,-1,1,0};
int vis_p[10][10],vis[10][10][10][10];
struct node
{
int bx,by;
int mx,my;
int step;
}tmp,p;
bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]!=1) return 1;
return 0;
}
void dfs(int prex,int prey,int mx,int my)
{
if(prex==mx&&prey==my) { flag=1;return ; }
if(flag) return ;
for(int i=0;i<4;++i)
{
int x=prex+dir[i][0];
int y=prey+dir[i][1];
if(check(x,y)&&!vis_p[x][y])
{
vis_p[x][y]=1;
dfs(x,y,mx,my);
}
}
}
void bfs2(int bx,int by,int mx,int my)
{
memset(vis,0,sizeof(vis));
ans=-1;
queue<node>pq;
while(!pq.empty()) pq.pop();
tmp={bx,by,mx,my,0};
pq.push(tmp);
while(!pq.empty())
{
tmp=pq.front();pq.pop();
if(mp[tmp.bx][tmp.by]==3) { ans=tmp.step;return ; }
for(int i=0;i<4;++i)
{
p=tmp;
p.bx+=dir[i][0],p.by+=dir[i][1];
prex=tmp.bx-dir[i][0],prey=tmp.by-dir[i][1];
if(!check(p.bx,p.by)) continue;
if(!check(prex,prey)) continue;
if(vis[p.bx][p.by][prex][prey]) continue;
memset(vis_p,0,sizeof(vis_p));
vis_p[tmp.bx][tmp.by]= vis_p[prex][prey]=1;
flag=0;
dfs(prex,prey,tmp. mx,tmp.my);
if(!flag) continue;
vis[p.bx][p.by][prex][prey]=1;
p.mx=prex,p.my=prey;
p.step++;
pq.push(p);
}
}
}
int main()
{
for(scanf("%d",&t);t--;)
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==4) { mx=i,my=j; }
if(mp[i][j]==2) { bx=i,by=j; }
}
bfs2(bx,by,mx,my);
printf("%d\n",ans);
}
}
/*
6666
5 5
3 0 1 0 0
1 0 1 4 0
0 0 1 0 0
1 0 2 0 0
0 0 0 0 0
5 5
0 3 0 0 0
1 0 1 4 0
0 0 1 0 0
1 0 2 0 0
0 0 0 0 0
5 5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 2 1 1
4 0 3 0 0
*/
HDU1254:推箱子(bfs+dfs)的更多相关文章
- HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...
- 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 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- 推箱子 BFS
[编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...
- hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- HDU1254--推箱子(BFS+DFS)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
随机推荐
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
- Notification通知创建
Notification通知创建 由于通知是一个远程视图,所以创建通知在状态栏显示需要用到三个主要的对象: 一.PendingIntent对象,用来承载Intent对象的,Intent对象主要是定义通 ...
- oc温习三:常用函数
参考文章: 算术函数 [算术函数] 函数名 说明 int rand() 随机数生成.(例)srand(time(nil)); //随机数初期化int val = rand()P; //0-49之间的随 ...
- Treasure Hunt--poj1066(最短路加判断线段的关系)
http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里 最后有一个点代表起始位置 现在想通过墙出去 他只能爆破每个房间的中点的门 问最少的门通 ...
- CodeForces 582A【multiset使用样例】
题意: 给一些无序的数字,求解一个矩阵,使得矩阵的每一个元素都是行和列标志数的gcd,输出行标志数. 首先对数字进行排序.复杂度n*log(n^2). 这题的证明有官方的英文题解==在这直接贴英文题解 ...
- Linux 特殊文档说明
目录 /usr/share/man 目录 /usr/share/doc /etc/passwd 文件 /etc/shadow 文件 /etc/group 文件 /usr/share/man 目录 当我 ...
- 附加数据库时,提示“Microsoft SQL Server,错误: 5120”, 解决方案
错误的提示内容为:
- Android点击Button水波纹效果
先上图,看看接下来我要向大家介绍的是个什么东西,例如以下图: 接下来要介绍的就是怎样实现上述图中的波纹效果.这样的效果假设大家没有体验过的话,能够看看百度手机卫士或者360手机卫士,里面的按钮点击效果 ...
- 安装和配置Apache-tomcat
https://tomcat.apache.org/download-90.cgi 我随便下载了一个,而且解压了 我把路径:G:\php\apache-tomcat-9.0.6\bin 放入path, ...
- #define中的#和##作用
#define语句中的#是把参数字符串化,##是连接两个参数成为一个整体. #define FACTORY_REF(name) { #name, Make##name } 中#name就是将传入的na ...