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[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int hash[10][10][10][10];
int vis[10][10],s[10][10];
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=0;
    return temp;
}

int judge(int x,int y)
{
    return x>=0&&x<n&&y>=0&&y<m&&s[x][y]!=1;
}
void dfs(int Nx,int Ny,int Mx,int My)
{
    if(Nx==Mx&&Ny==My)
    {
        found=1;return;
    }
    for(int i=0;i<4&&!found;i++)
    {
        int x=Nx+dx[i];
        int y=Ny+dy[i];
        if(judge(x,y)&&!vis[x][y])
        vis[x][y]=1,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]==3)
        {
            printf("%d\n",p.step);return;
        }
        for(int i=0;i<4;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,0,sizeof(vis));
                vis[p.Bx][p.By]=vis[Nx][Ny]=1;//注意这里箱子将成为阻碍物
                found=0;
                dfs(Nx,Ny,p.Mx,p.My);//判断人是否可达箱子后面
                if(found)
                {
                    hash[q.Bx][q.By][Nx][Ny]=1;
                    q.Mx=p.Bx;q.My=p.By;q.step++;
                    que.push(q);
                }
            }
        }
    }
    printf("-1\n");
    return;
}
void init()
{
    memset(hash,0,sizeof(hash));
    memset(s,0,sizeof(s));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
    {
        scanf("%d",&s[i][j]);
        if(s[i][j]==2)
        {
            Bx=i;By=j;
        }
        if(s[i][j]==4)
        {
            Mx=i;My=j;
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        init();
        bfs(Bx,By,Mx,My);
    }
}

时间: 2024-10-18 00:46:42

hdu1254(bfs+dfs)的相关文章

hdu 4771 求一点遍历所有给定点的最短路(bfs+dfs)

题目如题.题解如题. 由于目标点最多只有4个,先bfs出俩俩最短路(包括起点),再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #include<vector> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct point { int x,y; int cnt; }; char a[10

hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)

题目如题.题解如题. 因为目标点最多仅仅有4个,先bfs出俩俩最短路(包含起点).再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #include<vector> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct point { int x,y; int cnt; }; char a[1

HDU1254--推箱子(BFS+DFS)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 129 Accepted Submission(s): 59 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角

NYOJ - 1015 二部图(bfs/dfs)

题目链接:点我点我 题意:二分图判断问题 题解:两种解法,模拟下匹配过程. 1 //二分图匹配dfs 2 #include <cstring> 3 #include <vector> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N=11111; 9 vector <int> E[N]; 10 int col[N]; 11 12

SDUT 1157-小鼠迷宫问题(BFS&amp;DFS)

小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间.小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路.请帮助小鼠a找出所有通向小鼠b的最短道路. 请编程对于给定的小鼠的迷宫,计算小鼠a通向小

【LeetCode】 Surrounded Regions (BFS &amp;&amp; DFS)

题目:Surrounded Regions 广搜和深搜都能解决,但是LeetCode上使用深搜时会栈溢出 DFS: <span style="font-size:18px;">/*LeetCode Surrounded Regions * 题目:给定一个字符数组,由'X'和'O'组成,找到所有被x包围的o并将其替换为x * 思路:只要替换被包围的o就行,如果有一个o是边界或者上下左右中有一个是o且这个o不会被替换,则该点也不会被替换 * 从四条边开始,因为在这4周的一定不是

图的遍历(bfs+dfs)模板

bfs 1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 using namespace std; 5 queue<int>q; 6 int map[1001][1001]; 7 int vis[1001]; 8 int n,m; 9 void bfs(int p) 10 { 11 q.push(p); 12 vis[p]=1; 13 printf("%c-->"

POJ-3083 Children of the Candy Corn (BFS+DFS)

Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and must wander through the maze facing zombies, chainsaw-wielding psychopaths, hippies, and other terrors on their quest to find the exit. One popular maze-

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>