2024蓝桥杯C/C++ B组国赛

P10907 [蓝桥杯 2024 国 B] 蚂蚁开会 - 洛谷

暴力枚举:

把每条线段经过的整数点都求出,然后用map<pair<int, int>, int> 来记录每条线段上的每个点,会被访问多少次

如何求线段上的整点?

分别计算两点x轴坐标和y轴之差,取绝对值后,求出gcd,然后循环把整点为键,其值加一

最后从头到位遍历map,统计大于1的点有多少个

来看代码:

cpp 复制代码
#include <bits/stdc++.h>
#include<unordered_map>
using namespace std;


int gcd(int a, int b)
{
	if (b == 0)
	{
		return a;
	}
	else
	{
		return  gcd(b, a % b);
	}
}

map<pair<int, int>, int>arr;
vector<int>X1;
vector<int>Y1;
vector<int>X2;
vector<int>Y2;
void find_points(int now)
{
	int dx = X2[now] - X1[now];
	int dy = Y2[now] - Y1[now];
	int step = gcd(abs(dx), abs(dy));
	if (step == 0)
	{
		arr[{dx, dy}]++;
	}
	dx /= step;
	dy /= step;
	for (int i = 0; i <= step; i++)
	{
		arr[{X1[now] + i * dx, Y1[now] + i * dy }]++;
	}
}

int main()
{

	int n;
	cin >> n;
	X1 = vector<int>(n);
	Y1 = vector<int>(n);
	X2 = vector<int>(n);
	Y2 = vector<int>(n);
	for (int i = 0; i < n; i++)
	{
		cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
	}
	//每条线段 都把整点求出
	for (int i = 0; i < n; i++)
	{
		find_points(i);
	}
	int ans = 0;
	for (auto &it : arr)
	{
		if (it.second > 1)
		{
			ans++;
		}
	}
	cout << ans;

}
相关推荐
不会c嘎嘎18 小时前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
say_fall18 小时前
C语言编程实战:每日一题:随机链表的复制
c语言·开发语言·链表
唐·柯里昂79818 小时前
野火鲁班猫5使用正点原子 RTL8188EUS Wifi模块驱动移植(Linux5.10 Debian系统) 解决zsh报错
linux·c语言·mcu·物联网·ubuntu·硬件工程·软件构建
AKDreamer_HeXY19 小时前
ABC434E 题解
c++·算法·图论·atcoder
罗湖老棍子19 小时前
完全背包 vs 多重背包的优化逻辑
c++·算法·动态规划·背包
potato_may19 小时前
C++ 发展简史与核心语法入门
开发语言·c++·算法
魂梦翩跹如雨19 小时前
P8615 [蓝桥杯 2014 国 C] 拼接平方数——Java解答
java·c语言·蓝桥杯
爱装代码的小瓶子19 小时前
【cpp知识铺子】map和set的前身-二叉搜索树
c++·算法
Embedded-Xin20 小时前
Linux架构优化——spdlog实现压缩及异步写日志
android·linux·服务器·c++·架构·嵌入式
[J] 一坚20 小时前
华为OD、微软、Google、神州数码、腾讯、中兴、网易有道C/C++字符串、数组、链表、树等笔试真题精粹
c语言·数据结构·c++·算法·链表