二话不说先上题目
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z,即横坐标 是 00 到 11 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。
给定平面上20×21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z,即横 坐标是 0到 19 (包含 0 和 1919) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
此题采用枚举的思想,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。做此类题目时,切入点是枚举什么,不同的题目有不同的情况,找到枚举的对象也就迈出了第一步。
对此题进行分析,在一个区域内有n个点连线,问线的条数,找到线与线的不同(特征)!即是斜率与截距(k,b),而其限制情况就是这些点所连成的。故我们只需在枚举时注意是否为相同线。
接下来的便是重点:
我们可以把map看作映射(就像数学中的函数,只能一对一,不能一对多,扯远了😁😁😁)
其形式为map<typename1, typename2> mp;typename1是键的类型,typename2是值的类型。不过要注意字符串数组要用string
我们可以通过数组的形式进行其值,
再使用pair将k,b连成一组数据(结构体),统一对其进行标记。
代码:
#include<bits/stdc++.h>
using namespace std;
struct pos{
double x;
double y;
}p[25*25];
map<pair<double,double>,int>line;
int main()
{
int cnt=0;
int ans=20+21;
for(int i=0;i<20;i++)
for(int j=0;j<21;j++)
{
p[cnt].x=i;
p[cnt++].y=j;
}
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++)
{
if(p[i].x==p[j].x||p[i].y==p[j].y)
continue;
double k=(p[i].y-p[j].y)/(p[i].x-p[j].x);
double b=(p[i].x*p[j].y-p[j].x*p[i].y)/(p[i].x-p[j].x);
if(line[{k,b}]==0)
{
ans++;
line[{k,b}]=1;
}
}
cout<<ans<<endl;
}
一篇刷题笔记,希望自己好好努力。
程序小白,翻车勿怪。
