题目大意:一个n*n的棋盘上有m个棋子,若两个棋子处于同一行,或同一列,或同一对角线,并且此时它们中间没有其他棋子,这样算一次碰撞,求共有几次碰撞
思路:用四个数组记录行、列、两对角线的棋子数,再计算。由于一对角线为y=x+b,所以,同一对角线上的 棋子的x-y=b;另一对角线同理;
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int a[30005];
int b[30005];
int c[60005];
int d[60005];
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)
break;
int q;
scanf("%d",&q);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int k,x0,y0,s,t;
int sum=0;
for(int i=0;i<q;i++)
{
scanf("%d%d%d%d%d",&k,&x0,&y0,&s,&t);
for(int j=0;j<k;j++)
{
int x=x0+j*s;
int y=y0+j*t;
a[x]++;
b[y]++;
c[x+y]++;
d[x-y+n]++;
}
}
for(int i=1;i<=n;i++)
{
if(a[i]>1)sum+=(a[i]-1);
if(b[i]>1)sum+=(b[i]-1);
}
for(int i=1;i<=n+n;i++)
{
if(c[i]>1)sum+=(c[i]-1);
if(d[i]>1)sum+=(d[i]-1);
}
printf("%d\n",sum);
}
}