#include <iostream>
#include <cmath>
using namespace std;
int mapp_r[105],mapp_c[105];
int mapp_zx[210],mapp_zs[210];
int r[105],c[105];
int n,maxx=-1;
int cnt=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>r[i]>>c[i];
maxx=max(max(r[i],c[i]),maxx);
mapp_r[r[i]]++;
mapp_c[c[i]]++;
mapp_zs[r[i]+c[i]-1]++;
}
for(int i=1;i<=n;i++){
mapp_zx[maxx-r[i]+1+c[i]-1]++;
}
for(int i=1;i<=maxx;i++){
if(mapp_r[i]>=3){
int ans=mapp_r[i]*(mapp_r[i]-1)*(mapp_r[i]-2);
ans=ans/6;
cnt+=ans;
}
if(mapp_c[i]>=3){
int ans=mapp_c[i]*(mapp_c[i]-1)*(mapp_c[i]-2);
ans=ans/6;
cnt+=ans;
}
if(mapp_zx[i]>=3){
int ans=mapp_zx[i]*(mapp_zx[i]-1)*(mapp_zx[i]-2);
ans=ans/6;
cnt+=ans;
}
if(mapp_zs[i]>=3){
int ans=mapp_zs[i]*(mapp_zs[i]-1)*(mapp_zs[i]-2);
ans=ans/6;
cnt+=ans;
}
}
cout<<cnt;
return 0;
}
大概思路就是类似桶排,用四个数组分别记录 每条对角线/每排/每列 有多少点,然后用排列组合计算三点共线的情况.
这个彩笔猜测可能是mapp_zx出了问题,但是实在看不出错误
蒟蒻正趴在墙角瑟瑟发抖