zoukankan      html  css  js  c++  java
  • FZU 2124 bfs+vis记录

    第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了

    然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具

    每到一个地方 就朝四个方向都尝试一下能不能吃到 如果吃到了就更新ans

    需要注意的是刚开始就要尝试四个方向

    vis[2][25][25]的第一维记录道具状态

    一开始认为图太小 不用vis 然而不用vis就会出现跳不出循环的状况

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<map>
    #include<queue>
    using namespace std;
    char ma[25][25];
    bool vis[2][25][25];///0 没有 1 有了
    int n,m;
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};
    bool check(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m)
        return true;
        return false;
    }
    double ans;
    struct node
    {
        int x;
        int y;
        double time;
        bool daoju;
    };
    bool ok;
    double find(int x,int y)
    {
        ///1
        double a=0.0;
        int xx,yy;
        xx=x;
        yy=y;
        while(xx>0)
        {
            xx--;
            a+=0.2;
            if(ma[xx][yy]=='X')
            break;
            if(ma[xx][yy]=='B')
            {
                ok=true;
                return a;
            }
        }
        a=0.0;
        xx=x;
        yy=y;
        while(xx<n-1)
        {
            xx++;
            a+=0.2;
            if(ma[xx][yy]=='X')
            break;
            if(ma[xx][yy]=='B')
            {
                ok=true;
                return a;
            }
        }
        a=0.0;
        xx=x;
        yy=y;
        while(yy>0)
        {
            yy--;
            a+=0.2;
            if(ma[xx][yy]=='X')
            break;
            if(ma[xx][yy]=='B')
            {
                ok=true;
                return a;
            }
        }
        a=0.0;
        xx=x;
        yy=y;
        while(yy<m-1)
        {
            yy++;
            a+=0.2;
            if(ma[xx][yy]=='X')
            break;
            if(ma[xx][yy]=='B')
            {
                ok=true;
                return a;
            }
        }
        return 200.0;
    }
    void bfs(int x,int y)
    {
        vis[0][x][y]=false;
        node a;
        a.x=x;
        a.y=y;
        a.time=0.0;
        a.daoju=false;
        double aa=find(a.x,a.y);
        if(aa<150.0)
        {
            double b=aa+a.time;
            if(b<ans)
            {
                ans=b;
                ok=true;
            }
        }
        queue<node >q;
        q.push(a);
        while(!q.empty())
        {
            node b;
            b=q.front();q.pop();
            node c;
            for(int i=0;i<4;i++)
            {
                c=b;
                c.x+=dx[i];
                c.y+=dy[i];
                int v;
                if(c.daoju==false)
                v=0;
                else v=1;
                if(check(c.x,c.y)&&vis[v][c.x][c.y]==true)
                {
                    if(ma[c.x][c.y]!='X')
                    {
                        vis[v][c.x][c.y]=false;
                        if(c.daoju==false)
                        c.time+=1.0;
                        else c.time+=0.5;
                        if(ma[c.x][c.y]=='B')
                        {
                            if(c.time<ans)
                            ans=c.time;
                        }
                        else if(ma[c.x][c.y]=='S')
                        {
                            c.daoju=true;
                            double a=find(c.x,c.y);
                            if(a<150.0)
                            {
                                ok=true;
                                double b=a+c.time;
                                if(b<ans)
                                ans=b;
                            }
                            q.push(c);
                        }
                        else
                        {
                            double a=find(c.x,c.y);
                            if(a<150.0)
                            {
                                ok=true;
                                double b=a+c.time;
                                if(b<ans)
                                ans=b;
                            }
                            q.push(c);
                        }
                    }
                }
            }
        }
    }
    int main(){
    while(~scanf("%d%d",&n,&m))
    {
        memset(vis,true,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            scanf("%s",ma[i]);
        }
        ok=false;
        ans=9999.0;
        for(int i=0;i<n;i++)
        {
            for(int k=0;k<n;k++)
            {
                if(ma[i][k]=='P')
                {
                    bfs(i,k);
                    if(ok)
                    printf("%.1f
    ",ans);
                    else printf("-1
    ");
                }
            }
        }
    }
    }
    
  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5342834.html
Copyright © 2011-2022 走看看