hdu1254(bfs+dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254
分析:
真正移动的是箱子,但是要移动箱子需要满足几个条件。
1.移动方向上没有障碍。
2.箱子后方没有障碍。
3.人可以到达箱子后方的地方。这里dfs或bfs都可以实现
按条件搜索即可。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
typedef struct node
{
int Bx,By;
int Mx,My;
int step;
bool operator<(const node &a)const
{
return step>a.step;
}
}node;
int dx[]={,,,-};
int dy[]={,-,,};
int hash[][][][];
int vis[][],s[][];
int Bx,By,Mx,My,Nx,Ny;
int found,n,m;
node make_node(int a,int b,int x,int y)
{
node temp;
temp.Bx=a;temp.By=b;
temp.Mx=x;temp.My=y;
temp.step=;
return temp;
} int judge(int x,int y)
{
return x>=&&x<n&&y>=&&y<m&&s[x][y]!=;
}
void dfs(int Nx,int Ny,int Mx,int My)
{
if(Nx==Mx&&Ny==My)
{
found=;return;
}
for(int i=;i<&&!found;i++)
{
int x=Nx+dx[i];
int y=Ny+dy[i];
if(judge(x,y)&&!vis[x][y])
vis[x][y]=,dfs(x,y,Mx,My);
}
} void bfs(int Bx,int By,int Mx,int My)
{
priority_queue<node>que;
node p,q;
p=make_node(Bx,By,Mx,My);
que.push(p);
while(!que.empty())
{
node p=que.top();que.pop();
if(s[p.Bx][p.By]==)
{
printf("%d\n",p.step);return;
}
for(int i=;i<;i++)
{
q=p;
q.Bx=p.Bx+dx[i];//箱子移动的地方
q.By=p.By+dy[i];
Nx=p.Bx-dx[i];//箱子的后方
Ny=p.By-dy[i];
if(judge(q.Bx,q.By)&&judge(Nx,Ny)&&!hash[q.Bx][q.By][Nx][Ny])
{
memset(vis,,sizeof(vis));
vis[p.Bx][p.By]=vis[Nx][Ny]=;//注意这里箱子将成为阻碍物
found=;
dfs(Nx,Ny,p.Mx,p.My);//判断人是否可达箱子后面
if(found)
{
hash[q.Bx][q.By][Nx][Ny]=;
q.Mx=p.Bx;q.My=p.By;q.step++;
que.push(q);
}
}
}
}
printf("-1\n");
return;
}
void init()
{
memset(hash,,sizeof(hash));
memset(s,,sizeof(s));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&s[i][j]);
if(s[i][j]==)
{
Bx=i;By=j;
}
if(s[i][j]==)
{
Mx=i;My=j;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
bfs(Bx,By,Mx,My);
}
}
hdu1254(bfs+dfs)的更多相关文章
- Cleaning Robot (bfs+dfs)
Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...
- hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)
题目如题.题解如题. 因为目标点最多仅仅有4个,先bfs出俩俩最短路(包含起点).再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #i ...
- HDU1254--推箱子(BFS+DFS)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...
- 图的基本遍历算法的实现(BFS & DFS)复习
#include <stdio.h> #define INF 32767 typedef struct MGraph{ ]; ][]; int ver_num, edge_num; }MG ...
- HDU 1044 Collect More Jewels(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 图的遍历(bfs+dfs)模板
bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...
- POJ-3083 Children of the Candy Corn (BFS+DFS)
Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...
- POJ 3126 Prime Path(BFS算法)
思路:宽度优先搜索(BFS算法) #include<iostream> #include<stdio.h> #include<cmath> #include< ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
随机推荐
- sqlserver 存储过程实例
ALTER PROC [dbo].[SP_mm_NS] ( @ID NVARCHAR(60), @ReturnCode NVARCHAR(30) OUT ...
- 组件状态(TComponentState)11种和组件状态(TComponentStyle)4种
TOperation = (opInsert, opRemove); TComponentState = set of ( csAncestor The component was introduce ...
- 菜单组件——axure线框图部件库介绍
软件类的教程,我写不出长篇大论,这里面的都是基础的操作,希望初学者,根据一个功能演示,可以自己测试其他功能菜单的效果! Axure自带的菜单组件,我几乎没有用到过,做菜单导航,我第一时间想到的还是矩形 ...
- 获取TBitMap图像缓冲区,提高图像处理速度
使用Dephi进行图像处理可以有多种方法,最常用的应该算是TBitmap,它提供方便的图像存取能力,结合Canvas可进行画线.画圆.图像拷贝等操作.不过在进行大量的图像处理操作时,为了获得更高的速度 ...
- delphi之完美Splash方案(在TfrmMain.FormCreate里不断调用TfrmSplash显示加载进度文字,并且及时Update显示)
前言:网上有很多介绍delphi创建闪屏的代码,大多只是在程序开启前显示一个闪屏,但是却没有说如何在闪屏上显示程序加载的进度,于是笔者有意思介绍一下这种闪屏方式. 1.创建一个窗体(TfrmSplas ...
- java python oracle推断字符串是否为数字的函数
java public boolean isNumeric(String str){ Pattern pattern = Pattern.compile("^-?[0-9]+\\.?[0-9 ...
- OCA读书笔记(3) - 使用DBCA创建Oracle数据库
Objectives: •Create a database by using the Database Configuration Assistant (DBCA) •Generate databa ...
- Hibernate @Embeddable注解
在hibernate中实现自己定义类型,仅仅要实现UserType接口就可以或者以Component的形式提供.JPA的@Embedded有点类似,通过此凝视能够在你的Entity中使用一般的java ...
- android百度地图打包混淆 用不了No such file or directory (2) com.baidu.mapapi.BMapManager.init(Unknown Source)
调用了百度地图地图开发包是baidumapapi_v2_1_1.jar,定位SDK版本是locSDK_3.3.jar 调试的时候能运行!可是打包签名后就运行不了! baidu google 了好久! ...
- Qt 向word中插入文字(使用QAxWidget和QAxObject)
pro 文件中要加入 CONFIG += qaxcontainer 2. main.cpp #include <QApplication> #include <QAxWidget&g ...