2021年第12届蓝桥杯竞赛

第一题:《直线》

题目大意

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

在平面直角坐标系中,两点可以确定一条直线。

给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}(x,y)∣0≤x<20,0≤y<21,xZ,yZ,即横坐标是 00 到

1919 (包含 00 和 1919) 之间的整数、纵坐标是 00 到 2020 (包含 00 和 2020) 之 间的整数的点。

请问这些点一共确定了多少条不同的直线。

解题思路

在平面直角坐标系中,俩点可以确定一条直线,那俩点有四个坐标值,我们不太好维护四个坐标值是否重复。

我们知道直线的表示方式中,除了俩点式,还有点斜式,点斜式的话, 一个点俩个坐标值和一个斜率值,三个值来确定唯一性,虽然不太好写但是还是勉强能跑出来。

选择y = kx + b 这条方程来代表直线。我们怎么表示K呢,我是定义一个string字符串,存储分子和分母,这样就不用担心小数的问题了。

如下面代码,先存储20*21 = 420个点到 list 集合中。

     int x = 19, y = 20;ArrayList<Integer> list = new ArrayList<Integer>();//存储420个点的坐标for (int i = 0; i <= x; i++) {for (int j = 0; j <= y; j++) {list.add(i*100 + j);}

然后定义 HashSet 集合保存不重复的斜率和截距的直线(因为一个斜率和截距可以确定一条直线)

HashSet<String> set = new HashSet<String>();

然后嵌套两个 for 循环,遍历所有的点,(两层for循环代表第一个点和第二个点)

for (int i = 0; i < list.size(); i++) {for (int j = i+1; j < list.size(); j++) {

然后先找斜率:

                int a = list.get(i);int b = list.get(j);int x1 = a/100;int y1 = a%100;int x2 = b/100;int y2 = b%100;int down = x2 - x1;int up =   y2 - y1;//if (down!=0 && up !=0) {/*** 求斜率*/int gcd = gcd(down, up);String s = (up / gcd) + "/" + (down / gcd);
///当分母为0使,代表斜率不存在,此时存储直线 (x = 0:代表过点(0,0),斜率不存在的直线)if (down == 0) {set.add("x = " + x1);continue;}

再求截距:

                     /*** 求截距*/int y_down = y1 * down;int x_up   = x1 *up;int up2 = y_down - x_up;int gcd2 = gcd(up2, down);String s2 =(up2/gcd2) + "/" + (down/gcd2);

最后将截距和斜率字符串加入到 Set 集合;

set.add(s+" "+s2);

因为把分子分母分开存储,所以不要忘了约分,求分子和分母的最大公因数。

    public static int gcd(int m,int n){return n==0?m:gcd(n,m%n);}

完整代码:

import java.util.ArrayList;
import java.util.HashSet;
/** 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。在平面直角坐标系中,两点可以确定一条直线。给定平面上 20 × 2120×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​,即横坐标是 00​ 到 1919​ (包含 00​ 和 1919​) 之间的整数纵坐标是 00​ 到 2020​ (包含 00​ 和 2020​​) 之 间的整数的点。请问这些点一共确定了多少条不同的直线。
*/
public class 直线_1_2021 {public static void main(String[] args) {int x = 19, y = 20;ArrayList<Integer> list = new ArrayList<Integer>();//存储420个点的坐标for (int i = 0; i <= x; i++) {for (int j = 0; j <= y; j++) {list.add(i*100 + j);}}      HashSet<String> set = new HashSet<String>();//System.out.println(list.size());for (int i = 0; i < list.size(); i++) {int a = list.get(i);for (int j = i+1; j < list.size(); j++) {int b = list.get(j);int x1 = a/100;int y1 = a%100;int x2 = b/100;int y2 = b%100;int down = x2 - x1;int up =   y2 - y1;//if (down!=0 && up !=0) {/*** 求斜率*/int gcd = gcd(down, up);String s = (up / gcd) + "/" + (down / gcd);/*** 求截距*/if (down == 0) {set.add("x = " + x1);continue;}int y_down = y1 * down;int x_up   = x1 *up;int up2 = y_down - x_up;int gcd2 = gcd(up2, down);String s2 =(up2/gcd2) + "/" + (down/gcd2);/** 斜率和截距加入set集合*/set.add(s+" "+s2);//}}}   System.out.println(set.size());}//求最大公因数public static int gcd(int m,int n){return n==0?m:gcd(n,m%n);}}

最终答案:40257。

第12届蓝桥杯 第一题:《直线》相关推荐

  1. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  2. 旋转的风车-第12届蓝桥杯Scratch国赛真题第2题

    本文转自于"超平的编程课"公众号,更多教程,可移步至公众号. [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第6讲. ...

  3. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  4. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第128讲. 第12届蓝桥杯Scratch国赛真题,这 ...

  6. 求逆序数-第12届蓝桥杯Scratch省赛3真题第3题

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第43讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2021年4月24日举行的第二次省赛考 ...

  7. 绘制同心圆-第12届蓝桥杯Scratch省赛1真题第3题

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第53讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2020年10月19日举行的第一次省赛 ...

  8. 时光倒流-第12届蓝桥杯Scratch选拔赛真题精选

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第88讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...

  9. 电灯开关-第12届蓝桥杯Scratch省赛2真题第1题

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第50讲. 第12届蓝桥杯青少年组省赛分两次进行,这是2020年10月19日举行的第一次省赛 ...

最新文章

  1. 中科大硬核“毕业证”:“一生一芯”计划下,5位本科生带自研芯片毕业
  2. 图灵访谈系列之八:对话归隐的大师——Donald E. Knuth(高德纳)
  3. 一次问卷产品的MVP设计
  4. 关于控制台程序的一些想法
  5. Mock和Java单元测试中的Mock框架Mockito介绍
  6. 001@多用派发队列,少用同步锁
  7. 操作系统进程管理实验java_计算机考研操作系统进程管理
  8. Jquery attr 和removeAttr 的简单使用
  9. 大数据-HDFS文件系统是什么
  10. VMware vSphere 功能特性比较 vsphere 6.5/6.7/7.0
  11. 如何在Java中将字节数组转换为十六进制字符串?
  12. V-By-One协议说明
  13. STM32CubeIDE配置使用
  14. Python+Selenium+Appium环境搭建
  15. poj 1129 四色原理DFS
  16. 解决document.form.submit()对象不支持此属性或方法
  17. WORDPRESS QQ扫码登录插件
  18. 苹果手机测距离_iPhone 12 Pro可直接测身高 原来LiDAR扫描仪这样用
  19. html怎样用for循环添加表格,萌新提问!!!如何用for循环循环表单?
  20. 英国w l 是什么码数_英国广播公司的完整形式是什么?

热门文章

  1. sql 学习笔记 文档
  2. 如何查询x3650 m4服务器故障信息,IBM System x3650 M4常见问题及解决技巧
  3. 免费给你的网站加速,全球访问速度杠杠的
  4. 高德地图-根据经纬度获取地址(逆地理编码)
  5. WIN10增加简体中文(美式键盘)
  6. 台式计算机无法读取dvd,电脑光驱无法读取光盘原因
  7. Mozilla FireFox Gecko内核源代码解析(4.nsHTMLTokens)
  8. 该死的Print Splooer
  9. C语言实现三子棋小游戏(编程思路以及代码详解)
  10. SOLIDWORKS: Mold Design SOLIDWORKS:模具设计 Lynda课程中文字幕