The Morning Star

题目描述

本题有多组数据。

给定 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。

参考代码

cpp 复制代码
#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;
}
相关推荐
大千AI助手5 分钟前
蛙跳积分法:分子动力学模拟中的高效数值积分技术
算法·积分·数值积分·蛙跳积分法·牛顿力学系统·verlet积分算法
zycoder.12 分钟前
力扣面试经典150题day3第五题(lc69),第六题(lc189)
算法·leetcode·面试
你的冰西瓜31 分钟前
C++动态规划入门指南——助力CSP竞赛夺冠
c++·动态规划
西阳未落2 小时前
LeetCode——双指针
c++·算法
胖咕噜的稞达鸭2 小时前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法
笑口常开xpr3 小时前
【C++】模板 - - - 泛型编程的魔法模具,一键生成各类代码
开发语言·数据结构·c++·算法
AA陈超3 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-01.创建游戏玩法标签
c++·游戏·ue5·游戏引擎·虚幻
立志成为大牛的小牛3 小时前
数据结构——十四、构造二叉树(王道408)
数据结构·笔记·学习·程序人生·考研
IT小番茄3 小时前
Kubernetes云平台管理实战:自动加载到负载均衡(七)
算法
笑口常开xpr4 小时前
【C++继承】深入浅出C++继承机制
开发语言·数据结构·c++·算法