牛客网练习赛13---m皇后

题目链接

这道题简单来说就是暴力

原本思路是找出各个方向上的最远点

记录一下,然后暴力所有的点

然后暴力该点有多少个危险方向


然后看了大牛博客,学习了新方法

将所有点排序

比如纵列,先排序,是同一列的排一块,扫一遍该列

对于每一个元素,看一下后面有没有元素,如果有,那么该元素的下面方向不安全

对于上面的元素,上面的方向不安全,两者的不安全的方向都+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]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值