CF612B 题解
1.题意
找出在每条对角线上有多少个象,然后计算攻击对数就可以了。
2.思路
1.一看到题就直接想到先用数组把这个棋盘用一个二维数组存起来,有象的位置标记为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;
}