牛客练习赛13F-m皇后

链接: https://www.nowcoder.com/acm/contest/70/F
来源:牛客网

题目描述

在一个n*n的国际象棋棋盘上有m个皇后。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。

现在我们想要求出t 0,t 1,...,t 8,其中t i表示恰有i个方向是"不安全的"的皇后有多少个。

输入描述:

第一行两个整数n,m表示棋盘大小和皇后数量。
接下来m行每行两个整数ri,ci表示皇后坐标。
1 <= n, m <= 100,000
1 <= ri, ci <= n
数据保证没有皇后在同一个位置上。
 
 
#include<bits/stdc++.h>
using namespace std;
const int maxn=100007;
int t[10];
struct node
{
    int x,y;
    int num;
    int l,r,p,q;
}c[maxn];
bool cmp1(const node& a,const node& b)
{
    if(a.l!=b.l)return a.l<b.l;
    return a.r<b.r;
}
bool cmp2(const node& a,const node& b)
{
    if(a.r!=b.r)return a.r<b.r;
    else return a.l<b.l;
}
bool cmp3(const node& a,const node& b)
{
    if(a.p!=b.p)return a.p<b.p;
    return a.q<b.q;
}
bool cmp4(const node& a,const node& b)
{
    if(a.q!=b.q)return a.q<b.q;
    return a.p<b.p;
}
int main()
{
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&c[i].x,&c[i].y);
        c[i].l=c[i].x;
        c[i].r=c[i].y;
        c[i].p=c[i].x-c[i].y;
        c[i].q=c[i].x+c[i].y;
        c[i].num=0;
    }
    memset(t,0,sizeof(t));
    sort(c,c+m,cmp1);
    for(int i=1;i<m;i++)
    {
        if(c[i].l==c[i-1].l)
        {
            c[i].num++;c[i-1].num++;
        }
    }
    sort(c,c+m,cmp2);
    for(int i=1;i<m;i++)
    {
        if(c[i].r==c[i-1].r)
        {
            c[i].num++;c[i-1].num++;
        }
    }
    sort(c,c+m,cmp3);
    for(int i=1;i<m;i++)
    {
        if(c[i].p==c[i-1].p)
        {
            c[i].num++;c[i-1].num++;
        }
    }
    sort(c,c+m,cmp4);
    for(int i=1;i<m;i++)
    {
        if(c[i].q==c[i-1].q)
        {
            c[i].num++;c[i-1].num++;
        }
    }
    for(int i=0;i<m;i++) t[c[i].num]++;
    for(int i=0;i<8;i++)
        printf("%d ",t[i]);
    printf("%d\n",t[8]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值