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
");
            }
        }
    }
}
}
原文地址:https://www.cnblogs.com/rayrayrainrain/p/5342834.html