zoukankan      html  css  js  c++  java
  • BFS HDOJ 1242 Rescue

    题目传送门

    题意:从r走到a,遇到x多走一步,问最小走到a的步数

    分析:因为r有多个,反过来想从a走到某个r的最小步数,简单的BFS。我对这题有特殊的感情,去年刚来集训队时肉鸽推荐了这题,当时什么都不会,看个数组模拟队列的BFS看的头晕,现在看起来也不过如此,额,当年开始是从r走到a的,因为数据巨弱才过的,应该要用到优先队列。

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/9/25 星期五 09:13:51
    * File Name     :B_BFS.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 2e2 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-8;
    struct Angle    {
        int x, y, step;
        Angle () {}
        Angle (int x, int y, int step) : x (x), y (y), step (step) {}
    };
    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};
    bool vis[N][N];
    char maze[N][N];
    int n, m;
    
    bool judge(int x, int y)    {
        if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || maze[x][y] == '#') return false;
        else    return true;
    }
    
    void BFS(Angle s)    {
        int ret = INF;
        memset (vis, false, sizeof (vis));
        queue<Angle> Q; Q.push (s);
        vis[s.x][s.y] = true;
        while (!Q.empty ()) {
            Angle r = Q.front ();   Q.pop ();
            for (int i=0; i<4; ++i) {
                int tx = r.x + dx[i];
                int ty = r.y + dy[i];
                if (!judge (tx, ty))  continue;
                vis[tx][ty] = true;
                if (maze[tx][ty] == 'r')    {
                    ret = min (ret, r.step + 1);    continue;
                }
                else if (maze[tx][ty] == 'x')   {
                    Q.push (Angle (tx, ty, r.step + 2));    continue;
                }
                else    Q.push (Angle (tx, ty, r.step + 1));
            }
        }
        if (ret == INF) puts ("Poor ANGEL has to stay in the prison all his life.");
        else    printf ("%d
    ", ret);
    }
    
    int main(void)   {
        while (scanf ("%d%d", &n, &m) == 2) {
            for (int i=1; i<=n; ++i)    {
                scanf ("%s", maze[i] + 1);
            }
            bool find = false;  Angle start;
            for (int i=1; i<=n && !find; ++i)    {
                for (int j=1; j<=m; ++j)    {
                    if (maze[i][j] == 'a')  {
                        start = Angle (i, j, 0);
                        find = true;    break;
                    }
                }
            }
            BFS (start);
        }
    
        return 0;
    }
    

    当年的代码不忍直视。。。

    #include<stdio.h>
    typedef struct point
    {
        int x,y,step;
    }target;
    int N,M,dir[4][2]={0,1,0,-1,1,0,-1,0},ax,ay;
    int flag[202][202];
    char map[302][302];
    target que[40005];
    int BFS(target start)
    {
        int end,top,i;
        int min=1000000;
        target in,next;
        end=top=0;
        que[top]=start;
        while (top>=end)
        {
            in=que[end];
            end=(end+1);
            for (i=0;i<4;i++)
            {
                next.x=in.x+dir[i][0];
                next.y=in.y+dir[i][1];
                if (map[next.x][next.y]=='r')
                {
                    if (min>in.step+1)
                        min=in.step+1;
                }
                if (next.x>=0&&next.x<N&&next.y>=0&&next.y<M&&map[next.x][next.y]!='#')
                {
                    if (flag[next.x][next.y]>in.step+1)
                    {
                        next.step=in.step+1;
                        if (map[next.x][next.y]=='x')
                            next.step++;
                        flag[next.x][next.y]=next.step;
                        top=(top+1);
                        que[top]=next;
                    }
                }
            }
        }
        if (min!=1000000)return min;
        else
            return -1;
    }
    int main()
    {
        int i,j,num;
        target start;
        while (scanf("%d%d",&N,&M)!=EOF)
        {
            for (i=0;i<N;i++)
            {
                scanf("%s",map[i]);
                for (j=0;j<M;j++)
                {
                    flag[i][j]=1000000;
                    if (map[i][j]=='a')
                    {
                        //map[i][j]='.';
                        ax=i;
                        ay=j;
                    }
                }
            }
            start.x=ax;
            start.y=ay;
            start.step=0;
            //map[ax][ay]='.';
            num=BFS(start);
            if (num==-1)
                printf("Poor ANGEL has to stay in the prison all his life.
    ");
            else
                printf("%d
    ",num);
        }
        return 0;
    }
    

      

    编译人生,运行世界!
  • 相关阅读:
    数据挖掘实践(9):基础理论(九)数学基础(九)概率(五)⻉叶斯公式
    数据挖掘实践(8):基础理论(八)数学基础(八)概率(四)参数估计(二)
    数据挖掘实践(7):基础理论(七)数学基础(七)概率(三)参数估计(一)
    数据挖掘实践(6):基础理论(六)数学基础(六)概率(二)随机变量
    Linux上快速入门英特尔Optane DC Persistent Memory Module的配置与使用
    ovs 流表
    Cannot get thread event message: debugger service failed
    gdb ovs
    rror while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
    glibc
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4837255.html
Copyright © 2011-2022 走看看