怎么seo网站推广,建筑工程与土木工程区别,耐思尼克的建站宝盒,seo搜索引擎优化服务直线
题目描述
本题为填空题#xff0c;只需要算出结果后#xff0c;在代码中使用输出语句将所填结果输出即可。 在平面直角坐标系中#xff0c;两点可以确定一条直线。如果有多点在一条直线上#xff0c; 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 3 个…直线
题目描述
本题为填空题只需要算出结果后在代码中使用输出语句将所填结果输出即可。 在平面直角坐标系中两点可以确定一条直线。如果有多点在一条直线上 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点(x,y)∣0≤x2,0≤y3,x∈Z,y∈Z即横坐标 是 0到1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。
给定平面上 20×21 个整点 (x,y)∣0≤x20,0≤y21,x∈Z,y∈Z即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之 间的整数的点。
请问这些点一共确定了多少条不同的直线。
解题思路
本题用点斜式ykxb来表示直线。那么枚举所有点对构成的直线判断kb直线是新的还是之前已经枚举过的采用pairdouble,double存下k和b如何判断当前直线是否为初次遇到的新直线呢可用map判断是否是新的直线。对一条新的直线映射(mao)成1并统计累加让ans下一次再找到这条直线那么该直线的map值已经为1了就不重复统计。分析题述中给定平面上2×3个整点所确定的11条直线如下图3条横向2条竖线和6条斜线。 不妨首先把横线和竖线的条数统计到linenum直线总数中。根据题意横坐标是0到19包含0和19之间的整数那么竖线有20条即col20纵坐标是0到20那么有21条横线即row21。横线和竖线条数加起来先计入linenum初值linunumrowcol。 然后来求斜线由于任意两点可以确定一条直线。那么枚举所有的点嵌套的两重循环i和j都去枚举所有的点点i和点j就能确定一条直线现在来判断ij构造出来的直线line(k,b)是否之前已经计入过linenum中。 如果是初次遇见的新直线line那么就map其为1并且计入linenum即linenum否则表示之前已经出现过此直线line(k,b)就无需统计。一对kb就能表示出一条直线。在枚举所有点之前需要先保存所有点存入数组p中。已知i、j两点如何计算kb 用如下公式即可 k(p[j].y-p[i].y)/(p[j].x-p[i].x); b(p[j].xp[i].y-p[j].yp[i].x)/p[i].x-p[i].x);
最终答案40257 C代码
#includeiostream
#includemap
#includeutility
using namespace std;struct point{double x,y;
}p[25*25];mappairdouble,double,intline;//pair存斜率 k 和截距 b
//map是STL的一个关联容器他提供一对一的数据处理能力,使 点 与 直线 成 一对一对应关系
//用 xy 这个点作为索引并拥有相关联的指向 lineint的指针
//pair是将2个数据组合成一组数据 。 xy 这两个数据组合成一个点 xy以及 将 kb这两个数据合成一组数据 int main()
{//struct point p[25*25];int cnt0;int col20,row21;int i,j;for(i0;icol;i){for(j0;jrow;j){p[cnt].xi;p[cnt].yj;}}int linenumcolrow;//先确定横线和竖线的数量 for(i0;icnt;i){for(j0;jcnt;j){if(p[i].xp[j].x||p[i].yp[j].y)//跳过横线和竖线 continue;//k(y2-y1)/(x2-x1)//b(x1y2-x2y1)/(x1-x2)double k(p[j].y-p[i].y)/(p[j].x-p[i].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){line[{k,b}]1;linenum;}} }coutlinenumendl;return 0;
}