问题描述】一个矿工在指定地点挖矿,采矿的工具最长可达 k 。设有 n 个矿点,编号从 1 到 n ,其中第 i 个矿点的位置可以表示为一个平面整数坐标。
请根据矿工所在位置 (X,Y)找出所有可以采集的矿点,并找到其中最近和最远的矿点的编号,若不存在则均输出 -1。
【输入形式】输入共 n+1行。
第一行包含用空格分隔的四个整数 n 、X 、 Y 和 k ,分别表示矿点总数、矿工所在位置和采矿工具的最长可达距离。
第二行到第 n+1 行依次输入 n 个矿点的坐标。第 i+1 行(1<=i<=n)包含用空格分隔的两个整数 xi 和 yi,表示 i 号矿点所在位置。
【输出形式】输出共两行。
第一行输出一串编号,按编号从小到大,依次输出可以采集到的矿点编号,每个编号之间用空格分隔。若不存在则输出-1;
第二行输出可采集的最近、最远矿点的编号,当距离相同时,编号小的视为更近。用空格分隔。若不存在则均输出-1。
【样例输入1】
3 2 2 1
2 3
3 3
2 4
【样例输出1】
1
1 1
【样例说明】只有第 1 个矿点可以采集到
【样例输入2】
3 2 2 1
2 4
2 5
3 4
【样例输出2】
-1
-1 -1
【样例说明】没有可以采集到的矿点
【样例输入3】
3 2 2 3
2 4
2 0
3 5
【样例输出3】
1 2
1 2
【样例说明】1,2号矿点可以采集到,且距离相同,则1号视为更近,2号视为更远
【评分标准】
评测用例规模与约定
所有评测用例满足:1 ≤ n ≤ 100。
#include<bits/stdc++.h>
using namespace std;
struct kuang
{
int x,y,d,num;
};
kuang neng[100];
bool cmp2(kuang a,kuang b)
{
if(a.d!=b.d)
{
return a.d<b.d;
}
else
{
return a.num<b.num;
}
}
bool cmp1(kuang a,kuang b)
{
return a.num<b.num;
}
int main()
{
int n,X,Y,k;
cin>>n>>X>>Y>>k;
kuang kg[n];
int tool=k*k;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>kg[i].x>>kg[i].y;
kg[i].num=i+1;
kg[i].d=(kg[i].x-X)*(kg[i].x-X)+(kg[i].y-Y)*(kg[i].y-Y);
if(tool>=kg[i].d)
{
neng[i].x=kg[i].x;
neng[i].y=kg[i].y;
neng[i].num=kg[i].num;
sum++;
}
}
if(sum==0)
{
cout<<"-1"<<endl<<"-1"<<" "<<"-1";
}
else
{
sort(neng,neng+sum,cmp1);
for(int i=0;i<sum;i++)
{
cout<<neng[i].num <<" ";
}
cout<<endl;
sort(neng,neng+sum,cmp2);
cout<<neng[0].num<<" "<<neng[sum-1].num ;
}
}