这道题简单来说就是暴力
原本思路是找出各个方向上的最远点
记录一下,然后暴力所有的点
然后暴力该点有多少个危险方向
然后看了大牛博客,学习了新方法
将所有点排序
比如纵列,先排序,是同一列的排一块,扫一遍该列
对于每一个元素,看一下后面有没有元素,如果有,那么该元素的下面方向不安全
对于上面的元素,上面的方向不安全,两者的不安全的方向都+1
其他方向的同理,总共四条直线
只用扫描4次就行
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int t[9];
struct node
{
int x,y;//储存坐标
int H,s,p,q;//H表示所在的行,S表示所在的列,p,q表示所在的斜行
int num;//表示该点不安全的方向有几个
}huang[maxn];
bool cmp1(node a,node b)
{
if(a.H!=b.H)
return a.H<b.H;
else
return a.s<b.s;
}
bool cmp2(node a,node b)
{
if(a.s!=b.s)
return a.s<b.s;
else
return a.H<b.H;
}
bool cmp3(node a,node b)
{
if(a.p!=b.p)
return a.p<b.p;
else
return a.s<b.s;
}
bool cmp4(node a,node b)
{
if(a.q!=b.q)
return a.q<b.q;
else
return a.s<b.s;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
huang[i].x=x,huang[i].y=y;
huang[i].H=y,huang[i].s=x;
huang[i].p=x-y;
huang[i].q=x+y;
}
sort(huang,huang+m,cmp1);
for(int i=1;i<m;i++)
{
if(huang[i].H==huang[i-1].H)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp2);
for(int i=1;i<m;i++)
{
if(huang[i].s==huang[i-1].s)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp3);
for(int i=1;i<m;i++)
{
if(huang[i].p==huang[i-1].p)
{
huang[i].num++;
huang[i-1].num++;
}
}
sort(huang,huang+m,cmp4);
for(int i=1;i<m;i++)
{
if(huang[i].q==huang[i-1].q)
{
huang[i].num++;
huang[i-1].num++;
}
}
memset(t,0,sizeof(t));
for(int i=0;i<m;i++)
{
t[huang[i].num]++;
}
for(int i=0;i<=7;i++)
printf("%d ",t[i]);
printf("%d\n",t[8]);
}