P8073

· · 题解

这道题我们只要枚举每一个椅子离谁最近就可以了,如果离它最近的人多于一个那么就会爆炸。

枚举每个椅子的时候我们可以求出它对每个人的距离,然后排序,判断是否爆炸就可以了。

还有如果一个人爆炸了在以后的循环中就可以用 continue 忽视它了。

AC code:

#include<bits/stdc++.h>
using namespace std;
struct node{//用结构体储存点的信息
    int x,y,fl;
}chair[10050],man[10050];
struct nod{//距离和id
    double dis;int id;
};
bool operator < (nod x,nod y){//结构体比较大小
    return x.dis<y.dis;
}
double dis(node x,node y){//计算距离
    return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
int main(){
    int ans=0;
    int n,m,cnt=0,tot=0;cin>>n>>m;
    char ch;
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=m;j++){
            cin>>ch;
            if(ch=='L') chair[++cnt]={i,j,0};//记录
            if(ch=='X') man[++tot]={i,j,0};
        }
    for(int j=1;j<=cnt;j++){//枚举每一个椅子
        nod a[10050];int num=0;
        for(int i=1;i<=tot;i++){
            if(man[i].fl) continue;
            a[++num]={dis(chair[j],man[i]),i};
        }
        sort(a+1,a+1+num);//排序
        double dd=a[1].dis;
        for(int i=2;i<=num;i++){
            if(a[i].dis!=dd) break;
            man[a[i].id].fl=1;//爆炸的标记 
        }
        if(a[2].dis==a[1].dis) ans++;//如果爆炸就记录
    }
    cout<<ans;
    return 0;
}