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 ...
随机推荐
- EasyUI - Tree 树组件
效果: 数据库设计: 使用的数据: 其中的字段,是跟据要生成的树节点的属性定义的. text:代表要显示的字段名称. state:是否是目录节点. iconCls:节点的图标是什么. url:跳转的链 ...
- linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支
echo please input “runbip” to run bip. variableName="null" while [ $variableName != " ...
- 8天玩转并行开发——第二天 Task的使用
原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- perl 匿名函数传参
$subref=sub { my $a=shift; return $a; }; print $subref->("xxyyzz");
- 基于visual Studio2013解决C语言竞赛题之1052求根
题目 解决代码及点评 /* 功能:用简单迭代法解方程 e^x - x - 2 = 0 它有两个根(如图),其迭代公式为: 1) x[n+1]= e^x*n-2 (初值X<0时) ...
- Vertica数据库操作
删除主键(Vertica数据库的主键值并非唯一的): SELECT ANALYZE_CONSTRAINTS('fb_s.c_log'); 找到key名,再: ALTER TABLE fb_s.c_lo ...
- [置顶] oracle 数据库表中转换成java代码
--数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '') , 'private '||decode ...
- 轻应用 lapp
轻应用 LAPP (Light App) 即轻应用是一种无需下载.即搜即用的全功能 App,既有媲美甚至超越native app的用户体验,又具备webapp的可被检索与智能分发的特性,将有效解决优质 ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- Get RSA public key ASN.1 encode from a certificate in DER format
RSA public key ASN.1 encode is defined in PKCS#1 as follows: RSAPublicKey :: = SEQUENCE { modul ...