CCF

1

2

3

4

5

5

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

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

#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <bitset>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#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) <<endl
//#define de(x) cout <<""
#define rush() int T;scanf("%d",&T);each(kase,1,T)
#define scan(a,b) scanf("%d%d",&a,&b)
#define fin(a) scanf("%d",&a)
using namespace std;

const int maxn = 400+5;
const int maxm = 1e5+5;
const int INF = 0x3f3f3f3f;
inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'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);
        queue<node>Q;
        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<n&&ny<n&&a[nx][ny]==0)
                {
                    if(abs(dx[i])!=abs(dy[i])||!(a[nx][y]==1&&a[x][ny]==1))
                    {
                        vis[nx][ny]=1;
                        dis[nx][ny]=curdis+1;///重名
                        Q.push(node(nx,ny,curdis+1));
                    }
                }
            }
        }

        each(k,1,m)
        {

            int xx,yy;
            scan(xx,yy);
            if(life[k]==0)continue;///错误3
            int cost=dis[posx[k]][posy[k]];
            if(cost>=life[k])
                life[k]=0;
            else life[k]-=cost;
            posx[k]=xx;
            posy[k]=yy;///错误4
        }
    }
    each(i,1,m)
    {
        printf("%d
",life[i]);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/Tony100K/p/11649939.html