CF612B 题解

· · 题解

1.题意

找出在每条对角线上有多少个象,然后计算攻击对数就可以了。

2.思路

1.一看到题就直接想到先用数组把这个棋盘用一个二维数组存起来,有象的位置标记为1,再循环判断就可以了(直接打暴力)。
2.很明显,如果一条线上有n个象那么就有n*(n-1)/2对互相攻击的象。
更多的就看代码里的注释吧。

3.代码:

#include<cstdio>
#include<iostream>
using namespace std;
int n,mp[1010][1010],ans;//mp数组存棋盘 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int xx,yy;
        cin>>xx>>yy;
        mp[xx][yy]=1;
    }//输入 
    for(int i=1;i<=1000;i++)
    {
        int xx=i,yy=1,k=0;
        while(xx<=1000&&yy<=1000)//边界 
        {
            if(mp[xx][yy]==1)k++;
            xx++;yy++;
        }
        ans+=k*(k-1)/2;
    } 
    for(int i=2;i<=1000;i++)
    {
        int xx=1,yy=i,k=0;
        while(xx<=1000&&yy<=1000)
        {
            if(mp[xx][yy]==1)k++;
            xx++;yy++;
        }
        ans+=k*(k-1)/2;
    }//计算左上到右下的对角线 
    for(int i=1000;i>=1;i--)
    {
        int xx=i,yy=1,k=0;
        while(xx>=1&&yy<=1000)
        {
            if(mp[xx][yy]==1)k++;
            xx--;yy++;
        }
        ans+=k*(k-1)/2;
    }
    for(int i=2;i<=1000;i++)
    {
        int xx=1000,yy=i,k=0;
        while(xx>=1&&yy<=1000)
        {
            if(mp[xx][yy]==1)k++;
            xx--;yy++;
        }
        ans+=k*(k-1)/2;
    }//左下到右下的对角线 
    cout<<ans;
    return 0;
}

完结撒花