CCF - CCSP 2018-01 绝地求生 BFS

CCF - CCSP 2018-01 绝地求生 BFS_第1张图片

CCF - CCSP 2018-01 绝地求生 BFS_第2张图片

CCF - CCSP 2018-01 绝地求生 BFS_第3张图片

CCF - CCSP 2018-01 绝地求生 BFS_第4张图片

CCF - CCSP 2018-01 绝地求生 BFS_第5张图片

CCF - CCSP 2018-01 绝地求生 BFS_第6张图片

BFS从安全地区方向搞一下就好了

1.还是注意每回合清空
2.posx居然开小了,可不能犯这种错误
3.地图用a和节点的dis重名了,建议其他变量禁止用a命名
4.在输入数据之前continue了,这样会导致读数据混乱
5.注意距离还是用勾股定理那种,不是你想象的曼哈顿距离,火焰纹章玩多了吧

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
#define mm0(a) memset(a,0,sizeof(a))
#define mm(a,b) memset(a,b,sizeof(a))
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout << #x << " " << (x) <'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}

/**
4 2 4 1 1
0 3
1 1
2 2
3 0
1 2
2 0
2 3 2
1 3
3 3
n m e f h
*/

int distance(int x,int y,int sx,int sy)
{
    return abs(x-sx)*abs(x-sx)+abs(y-sy)*abs(y-sy);
}
int n,m,e,f,h;
int a[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn][maxn];
int dx[]={0,0,1,-1,1,1,-1,-1};
int dy[]={1,-1,0,0,-1,1,-1,1};
int posx[maxm];
int posy[maxm];///开小了
int life[maxm];
struct node
{
    int x,y;
    int dis;
    node(int x,int y,int dis):x(x),y(y),dis(dis){}
};
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&e,&f,&h);
    each(i,1,e)
    {
        int x,y;
        scan(x,y);
        a[x][y]=1;
    }
    each(i,1,m)
    {
        scanf("%d%d",&posx[i],&posy[i]);
    }
    each(i,1,m)
        life[i]=h;
    while(f--)
    {
        ///每回合清空
        mm0(vis);
        memset(dis,INF,sizeof(dis));
        int sx,sy,r;///又重名了!!!!
        scan(sx,sy);
        scanf("%d",&r);
        queueQ;
        while(!Q.empty())Q.pop();
        each(i,0,n-1)
        {
            each(j,0,n-1)
            {
                if(distance(i,j,sx,sy)<=r*r)
                {
                    vis[i][j]=1;
                    dis[i][j]=0;
                    Q.push(node(i,j,0));
                }
            }
        }
        while(!Q.empty())
        {
            node q=Q.front();
            Q.pop();
            int x=q.x;
            int y=q.y;
            int curdis=q.dis;
            int nx,ny;
            for(int i=0;i<=7;i++)
            {
                nx=x+dx[i];
                ny=y+dy[i];
                if(!vis[nx][ny]&&nx>=0&&ny>=0&&nx=life[k])
                life[k]=0;
            else life[k]-=cost;
            posx[k]=xx;
            posy[k]=yy;///错误4
        }
    }
    each(i,1,m)
    {
        printf("%d\n",life[i]);
    }

    return 0;
}

你可能感兴趣的:(CCF - CCSP 2018-01 绝地求生 BFS)