直线
- ==问题描述==
- ==格式输入==
- ==格式输出==
- ==评测用例规模与约定==
- ==解析==
- ==参考程序==
- 难度等级
问题描述
格式输入
无
格式输出
填空题提交答案即可
评测用例规模与约定
无
解析
题目要求点和点确定一条直线,如果没有多个点在同一条直线只能算一条直线这个条件就很简单。一共21*20个点,直接从1加到21x20-1就可以,但是这里要求多点在一条直线上就只能算一条,所以我们不如想一想有多少直线是有超过两个点在的。
利用直线方程y=kx+b;枚举所有点之间的情况,算出k与b,记录k,b在map当中,并将直线条数+1,之后再遇到k,b相同的就不算了。特别的枚举过程中相同的点continue跳过。
k很好算,b如图所示。
参考程序
#include<bits/stdc++.h>
using namespace std;
struct Point{
double x,y;
}p[25*25];
map <pair <double, double>, int> line;//储存斜率k和截距b,表示直线line
int main(){
int col = 20;
int row = 21;
int cnt = 0;
int linecnt = col+row;
for(int i = 0; i < row; i++){
for(int j = 0; j < col; 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[j].y - p[i].y) / (p[j].x - p[i].x);
double b = (p[j].x*p[i].y-p[j].y*p[i].x)/(p[j].x-p[i].x);
if(line[{k,b}] == 0) {
line[{k,b}] = 1;
linecnt++;
}
}
}
cout<< linecnt<< endl;
return 0;
}
难度等级
⭐️⭐️⭐️再加半颗吧,比较难想但是代码很好写(1~10星)
以个人刷题整理为目的,如若侵权,请联系删除~