zoukankan      html  css  js  c++  java
  • JAG Practice Contest for ACM-ICPC Asia Regional 2016B题【BFS】

    题意:

    就是公主要逃跑,士兵要抓公主,问你能不能逃跑哇;

    思路:

    就是终点搞成起点,然后BFS一下就好了,最后枚举一下出口到公主的距离是不是<所有的到士兵的距离;

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    const int N=2e2+10;
    
    struct asd{
        int x,y;
    };
    int dx[4]={0,0,-1,1};
    int dy[4]={1,-1,0,0};
    char s[N][N];
    int step[N][N];
    int n,m;
    int sx,sy;
    queue<asd>q;
    
    void init()
    {
        while(!q.empty())
            q.pop();
        memset(step,-1,sizeof(step));
    }
    
    bool Judge(int x,int y)
    {
        if(x<0||y<0||x>=n||y>=m)
            return 0;
        if(s[x][y]=='#')
            return 0;
        return 1;
    }
    
    void bfs()
    {
        init();
        asd now,next;
        now.x=sx;
        now.y=sy;
        step[now.x][now.y]=0;
        q.push(now);
        while(!q.empty())
        {
            now=q.front();
            q.pop();
    //        printf("%d %d
    ",now.x,now.y);
            for(int i=0;i<4;i++)
            {
                int x=now.x+dx[i];
                int y=now.y+dy[i];
                if(Judge(x,y))
                {
                    if(step[x][y]==-1)
                    {
                        step[x][y]=step[now.x][now.y]+1;
                        next.x=x;
                        next.y=y;
                        q.push(next);
                    }
                }
            }
        }
        int temp1;
        int temp2=0x3f3f3f3f;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(s[i][j]=='@')
                {
                    temp1=step[i][j];
                }
                if(s[i][j]=='$'&&step[i][j]!=-1)
                {
                    temp2=min(temp2,step[i][j]);
                }
            }
        }
        if(temp1<temp2)
            puts("Yes");
        else
            puts("No");
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%s",s[i]);
        int f=0;
    
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(s[i][j]=='%')
                {
                    sx=i;
                    sy=j;
                    f=1;
                    break;
                }
            }
            if(f)
                break;
        }
        bfs();
        return 0;
    }


  • 相关阅读:
    .net开发环境的选择
    html头部的一些信息
    SQLHelper类
    C#实现文件下载
    js类
    Winform小知识点
    emacs 代码缩进
    自己喜欢的shell终端配置
    time_wait过多的优化
    Emacs 电子邮件组件RMAIL
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934738.html
Copyright © 2011-2022 走看看