P8073
lidagua1004 · · 题解
这道题我们只要枚举每一个椅子离谁最近就可以了,如果离它最近的人多于一个那么就会爆炸。
枚举每个椅子的时候我们可以求出它对每个人的距离,然后排序,判断是否爆炸就可以了。
还有如果一个人爆炸了在以后的循环中就可以用 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;
}