• 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
    ",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
    ");
        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);
        }
    }
    View Code
  • 相关阅读:
    转载viewstate(一) 太经典的东西 不得不转载保存下来
    Asp.Net中HttpModule的研究(转)
    linux学习笔记(9)
    老手经验谈:Linux驱动程序开发学习步骤(转)
    浅谈C中的malloc和free(1)
    ASP.NET的HttpModule和HttpHandler(转)
    C语言学习笔记(1)
    xcode 4 code sense
    不是bug 是教训
    win7 管理员 开关命令
  • 原文地址:https://www.cnblogs.com/lienus/p/4168305.html
Copyright © 2020-2023  润新知