题目描述
本题有多组数据。
给定 n 个点,第 i 个点的坐标为 xi,yi。
现需要将星星和指南针放在任意两个点上,使得星星在指南针的正北、正东、正西、正南、正东南、正东北、正西南或正西北方向,求一共几种放法。(如果对此不太理解结合样例解释)
输入格式
第一行输入一个t,表示数据组数。
在每组数据中,输入n,表示点的总数。
接下来 n 行,第i行输入两个数 xi,yi,表示第i个点的坐标。
输出格式
输出共t行,每行一个整数,表示第i组数据的结果。
提示
在第一组数据中:
指南针在 (0,0)(0,0),星星在 (−1,−1)(−1,−1),在指南针的正西南方向。
指南针在 (0,0)(0,0),星星在 (1,1)(1,1),在指南针的正东北方向。
指南针在 (−1,−1)(−1,−1),星星在 (0,0)(0,0),在指南针的正东北方向。
指南针在(−1,−1)(−1,−1),星星在(1,1)(1,1),在指南针的正东北方向。
指南针在(1,1)(1,1),星星在(0,0)(0,0),在指南针的正西南方向。
指南针在(1,1)(1,1),星星在(−1,−1)(−1,−1),在指南针的正西南方向。
所以答案为6。
在第二组数据中:
指南针在(6,9)(6,9),星星在(10,13)(10,13),在指南针的正东北方向。
指南针在(10,13)(10,13),星星在(6,9)(6,9),在指南针的正西南方向。
所以答案是 2。
参考代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll x[200005], y[200005];
bool Z(ll x1, ll y1, ll x2, ll y2)
{
return (abs(x1 - x2) == abs(y1 - y2)) ? true : false;
}
bool north(int z, int star)
{
return (x[z] == x[star] && y[z] < y[star]) ? true : false;
}
bool south(int z, int star)
{
return (x[z] == x[star] && y[z] > y[star]) ? true : false;
}
bool west(int z, int star)
{
return (y[z] == y[star] && x[z] > x[star]) ? true : false;
}
bool east(int z, int star)
{
return (y[z] == y[star] && x[z] < x[star]) ? true : false;
}
bool eastsouth(int z, int star)
{
return (Z(x[z], y[z], x[star], y[star]) && x[z] < x[star] && y[z] > y[star]) ? true : false;
}
bool eastnorth(int z, int star)
{
return (Z(x[z], y[z], x[star], y[star]) && x[z] < x[star] && y[z] < y[star]) ? true : false;
}
bool westsouth(int z, int star)
{
return (Z(x[z], y[z], x[star], y[star]) && x[z] > x[star] && y[z] > y[star]) ? true : false;
}
bool westnorth(int z, int star)
{
return (Z(x[z], y[z], x[star], y[star]) && x[z] > x[star] && y[z] < y[star]) ? true : false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n, ans = 0;
cin>>n;
for(int i = 1; i <= n; i++)
cin>>x[i]>>y[i];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
continue;
if(north(i, j) || south(i, j) || west(i, j) || east(i, j))
ans++;
else if(eastnorth(i, j) || eastsouth(i, j) || westnorth(i, j) || westsouth(i, j))
ans++;
}
}
cout<<ans<<"\n";
}
return 0;
}