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; }