计算直线的交点数
主要实现思路
- 整体流程思路:
- 程序旨在解决给定平面上不同数量的直线(无三线共点),求出每种直线数量下所有可能的交点数量,并按要求格式输出的问题。整体通过初始化一个二维数组来存储不同直线数量与交点数量对应的存在状态,先基于简单情况(全平行时交点数为 0)进行初始化,然后利用双重嵌套循环逐步推导更多直线数量下的交点情况,最后通过循环读取输入的直线数量,查找并输出对应直线数量下所有可能的交点数量,以此来处理多组测试数据,直到文件末尾结束运行。
- 具体步骤思路:
- 数组初始化阶段:
- 首先定义了一个二维数组
a[21][191],根据n条直线最多可有(n - 1) * n / 2个交点(这里考虑n <= 20的上限,所以第二维大小设为 191 能涵盖所有可能交点数情况),用于存储不同直线总数(行索引表示)与交点数量(列索引表示)之间的某种状态关系,初始将数组所有元素设为 0,表示初始时都不确定是否存在相应的直线与交点数量组合情况。 - 接着通过
for (int i = 0; i < 21; i++) { a[i][0] = 1; }循环将每一行(对应不同直线总数情况)中列坐标为 0 的元素值都设为 1,这是因为所有直线都平行时交点数必然为 0,先把这种基础的、确定的情况在数组中标记好,方便后续基于此推导其他情况。
- 首先定义了一个二维数组
- 交点情况推导阶段(动态规划思想体现):
- 外层
for (int x = 2; x <= 20; x++)循环从 2 条直线开始,到 20 条直线为止,遍历不同的总直线数x,目的是逐步计算每种直线总数下的交点情况。对于每个x值:- 中层
for (int n = 0; n <= x; n++)循环遍历不平行部分的直线数量n(范围从 0 到当前总直线数x),这里n代表在x条直线里不平行的那些直线数量,通过改变n的值可以考虑各种不同的直线平行、相交组合方式,来推导对于总直线数x的交点情况。 - 内层
for (int j = 0; j <= (n - 1) * n / 2; j++)循环针对当前不平行直线数量n所能产生的交点数量范围(从 0 到n条直线最多能产生的交点数(n - 1) * n / 2)进行遍历,用于检查在这种特定的n条不平行直线及其交点数j的组合下,能否推导出对于总直线数为x的交点情况。 - 在这个三重循环内部,当发现对于
n条直线存在j个交点(即a[n][j] == 1)这种已知的有效交点情况组合时,就通过计算(x - n) * n + j来得到在x条直线中,若有n条直线按已有的j个交点情况排列,其余(x - n)条直线与这n条直线相交所能产生的交点数量,然后将数组a[x][(x - n) * n + j]的位置标记为 1,表示存在x条直线有这么多个交点的情况,通过这样不断利用已知的交点情况去推导更多直线数量下的交点情况,逐步填充数组a,记录下各种可能的直线与交点数量的存在关系。
- 中层
- 外层
- 结果输出阶段:
- 定义变量
n用于接收输入的直线数量,通过while (scanf("%d", &n)!= EOF)循环读取多组测试数据,只要没读到文件末尾就持续处理新输入的直线数量情况。 - 对于每次输入的直线数量
n,通过for (int i = 0; i <= (n - 1) * n / 2; i++)循环遍历n条直线所能产生的所有可能交点数量范围,检查数组a[n][i]的值,如果a[n][i] == 1,说明对于n条直线存在i个交点这种情况是存在的,就输出这个交点数量i,并且每个交点数量之间用一个空格隔开。 - 当输出完一组直线数量
n对应的所有交点数量后,通过putchar('\n');输出一个换行符,使每组测试实例的输出结果都换行显示,符合题目要求的输出格式,接着继续循环读取下一组输入的直线数量进行处理,直到文件末尾结束整个程序的运行。
- 定义变量
- 数组初始化阶段:
#include <stdio.h>int main()
{// n条直线最多可有(n - 1) * n / 2个交点,例如20条直线最多有190个交点,这里根据题目中直线数量上限(n <= 20)确定二维数组第二维的大小为191,以涵盖所有可能的交点数量情况int a[21][191] = { 0 };// 初始化二维数组a的所有元素为0,这个数组用于存储不同直线数量下对应不同交点数量是否存在的状态,后续通过计算来更新这些状态值// 例如a[i][j]中,i表示直线的总数,j表示交点的数量,a[i][j] = 1表示存在i条直线有j个交点这种情况,初始都设为0表示都还未确定是否存在相应情况// 外层循环初始化每一行(对应不同直线总数情况)中列坐标为0的元素值都为1,也就是表示所有直线都平行时(交点数为0)的情况,先将这种基础情况标记好for (int i = 0; i < 21; i++){a[i][0] = 1;}// 外层循环开始遍历不同的总直线数x,从2条直线开始(因为1条直线不存在交点情况已经在初始化时涵盖了平行无交点即a[1][0] = 1的情况),到20条直线为止,这个循环用于逐步推导更多直线数量下的交点情况for (int x = 2; x <= 20; x++){// 中层循环遍历不平行部分的直线数量n,范围是从0到当前总直线数x,这里n表示在x条直线中不平行的那些直线数量,通过改变n的值来考虑不同的直线平行、相交组合情况for (int n = 0; n <= x; n++){// 内层循环遍历当前不平行直线数量n所能产生的交点数量范围,也就是从0到n条直线最多能产生的交点数(n - 1) * n / 2,用于检查在这种特定的不平行直线数量及其交点数组合下,能否推导出对于更多直线(总直线数为x)的交点情况for (int j = 0; j <= (n - 1) * n / 2; j++){// 如果发现对于n条直线存在j个交点这种情况(即数组中对应位置的值为1),说明找到了一种已知的有效交点情况组合if (a[n][j] == 1){// 基于这种已知情况,去更新对于总直线数为x时的交点情况。计算(x - n) * n + j得到在x条直线中,当有n条直线按已有的j个交点情况排列,其余(x - n)条直线与这n条直线相交所能产生的交点数量,将对应的数组位置标记为1,表示存在x条直线有这么多个交点的情况a[x][(x - n) * n + j] = 1;}}}}// 定义变量n,用于接收输入的直线数量,通过循环读取多组测试数据,只要没读到文件末尾(EOF)就持续处理输入的直线数量情况int n;while (scanf("%d", &n) != EOF){// 循环遍历当前输入的直线数量n所能产生的所有可能交点数量范围,也就是从0到(n - 1) * n / 2,去检查哪些交点数量情况是存在的(对应数组位置值为1)for (int i = 0; i <= (n - 1) * n / 2; i++){// 如果发现对于n条直线存在i个交点这种情况(即a[n][i] == 1),就输出这个交点数量if (a[n][i] == 1){printf("%d ", i);}}// 每组输出结束后,输出一个换行符,使每组测试实例的输出结果换行显示,更符合输出格式要求putchar('\n');}return 0;
}

相关文章:
计算直线的交点数
主要实现思路 整体流程思路: 程序旨在解决给定平面上不同数量的直线(无三线共点),求出每种直线数量下所有可能的交点数量,并按要求格式输出的问题。整体通过初始化一个二维数组来存储不同直线数量与交点数量对应的存在…...
STM32基于HAL库的串口接收中断触发机制和适用场景
1. HAL_UART_Receive_DMA函数 基本功能 作用:启动一个固定长度的 DMA 数据接收。特点: 需要预先指定接收数据的长度(Size 参数)。DMA 会一直工作直到接收到指定数量的数据,接收完成后触发 HAL_UART_RxCpltCallback 回…...
java面试宝典
本文只摘抄部分宝典内容,完整宝典可以在打开下方链接,在网盘获取 ^ _ ^ 链接:java面试宝典 提取码: wxy1 复制这段内容后打开百度网盘手机App,操作更方便哦 链接: java前端面试宝典 提取码: wxy1 复制这段内容后打开百度网盘手机Appÿ…...
Scala—Slice(提取子序列)方法详解
Scala—Slice(提取子序列)方法详解 在 Scala 中,slice 方法用于从集合中提取一个连续的子序列(切片)。可以应用于多种集合类型,如 List、Array、Seq 等。 一、slice 方法的定义 slice 根据提供的起始索引…...
【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向
【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…...
【SKFramework框架核心模块】3-5、函数扩展模块
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...
使用 EasyExcel 提升 Excel 处理效率
目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中,Excel 文件的处理是不可避免的一项任务,特别是在…...
【提高篇】3.7 GPIO(七,GPIO开发模型 一)
目录 一,开发模型 二,初始化函数 2.1 时钟使能 一,开发模型 通常我们在进行GPIO相关外设的开发时,往往遵循下面4个步骤,如下: 初始化函数 用于进行时钟设置、参数设置、IO设置、中断设置等。读处理函数 用于从外设读取数据。写处理函数 用于从向外设写数据。中断处理…...
Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物
前言 在前端开发中,优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标,Tree Shaking 就是其中一种非常重要的优化技术,它通过在编译阶段移除未被使用的代码模块,从而显著减小最终…...
angular19-官方教程学习
周日了解到angular已经更新到19了,想按官方教程学习一遍,工欲善其事必先利其器,先更新工具: 安装新版版本 卸载老的nodejs 20.10.0,安装最新的LTS版本 https://nodejs.org 最新LTS版本已经是22.12.0 C:\Program File…...
RocketMQ集群部署完整指南
前言 本文将详细介绍RocketMQ集群的部署流程,包括环境准备、安装配置、启动运维等各个方面。 一、环境准备 1.1 系统要求 64位操作系统,建议LinuxJDK 1.8及以上版本源码安装需要Maven 3.2.x1.2 下载RocketMQ 可从以下地址获取RocketMQ安装包: Apache官方开源地址: http://r…...
解决mysql 内存持续上涨问题
问题背景: 业务量不大,Mysql 内存持续上涨,虽然不是很明显,但随着时间慢慢增长,1~2个月左右内存达到80%一旦有一些执行缓慢的sql 内存会快速上去增加/修改大表的字段内存会快速上去 常规操作: Mysql 设置…...
Qt 小项目 学生管理信息系统
主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求…...
16-01、JVM系列之:内存与垃圾回收篇(一)
JVM系列之:内存与垃圾回收篇(一) ##本篇内容概述: 1、JVM结构 2、类加载子系统 3、运行时数据区之:PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系,它只是与特…...
聊聊系统的弹力设计-服务器性能指标篇(一)
一、什么是弹性机制 弹性,大家可以轻易的联想到橡胶,可伸缩性是弹性机制的一个很重要的特点,但是实际上弹性不等同于可伸缩性 弹性(Elasticity) 通常指的是系统能够自动适应负载的变化,即自动扩展和收缩资…...
MQ:kafka-消费者的三种语义
文章目录 前言(一) 创建topic(二) 生产者(三)消费者1. At-most-once Kafka Consumer2. At-least-once kafka consumer3. 使用subscribe实现Exactly-once4. 使用assign实现Exactly-once 前言 本文主要是以kafka 09的client为例子,详解kafka c…...
中国1km分辨率SSP119情景(SSP119、SSP245 SSP585),模式逐月降水量数据集(2021-2100)
目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 干旱监测平台 中国1km分辨率SSP119情景EC-Earth3模式逐月降水量数据集(2021-2100) 简介 该数据集为中国多情景多模式逐月降水量数据,空间分辨率为0.0083333(约1km),时间为2021年1月-2100年…...
21天掌握javaweb-->第8天:前后端分离架构与Axios请求
前后端分离架构概念 前后端分离架构是一种现代Web应用开发模式,其中前端和后端分别独立开发和部署,通过API进行数据交互。这种架构使得前端专注于用户界面和用户体验,而后端则专注于业务逻辑和数据处理。 优势 开发效率高:前后端可以并行开发,减少了开发时间。技术栈灵活…...
基于阻塞队列的生产者消费者模型动画演示
一个基于阻塞队列的生产者消费者模型的动画演示: 这是打包好的程序。程序是用 QT 写的。 通过网盘分享的文件:CP模型.7z 链接: https://pan.baidu.com/s/1YjC7YiSqHGqdr6bbffaDWg?pwde6g5 提取码: e6g5 CP模型...
DHCP和BOOTP选项及DHCP协议操作详解
DHCP和BOOTP选项及DHCP协议操作详解 DHCP与BOOTP简介 1. BOOTP(Bootstrap Protocol) 功能:提供静态配置的IP分配。用途:在早期用于无盘工作站启动时获取IP地址和基本配置。缺点:只能提供静态IP配置,无法动…...
初识Git,带你深入学习Git相关的知识
在之前的博客中,我都会在博客的开头放一个gitee的链接。Gitee是什么呢?它是一个远程的代码托管库。在我们学习和项目管理的时候起着非常重要的作用。 本期我就带领着大家一起学习Git相关的知识内容。学习它的操作,了解其在企业级开发中的作用…...
TTI-Chicago等机构突破性研究:AI学会了一笔一划创作矢量草图
这项由芝加哥丰田技术研究院(TTI-Chicago)、芝加哥大学和麻省理工学院联合开展的研究发表于2026年,论文编号为arXiv:2603.19500v1。有兴趣深入了解技术细节的读者可以通过该编号查询完整论文。当我们看到一位画家创作时,他们通常不…...
Qwen3-0.6B应用案例:如何用它快速生成文案和邮件回复
Qwen3-0.6B应用案例:如何用它快速生成文案和邮件回复 1. 引言:轻量级AI写作助手 在日常工作中,我们经常需要处理大量文字工作:撰写产品介绍、回复客户邮件、编写营销文案等。这些任务虽然不复杂,但耗时耗力。Qwen3-0…...
不会画画也能创作!梦幻动漫魔法工坊新手入门全攻略
不会画画也能创作!梦幻动漫魔法工坊新手入门全攻略 1. 为什么你需要这个工具 你是否曾经有过这样的经历:脑海中浮现出一个绝妙的动漫角色形象,却因为不会画画而无法将它呈现出来?或者想为社交媒体创作独特的二次元头像ÿ…...
小爱音响音乐服务:如何让智能音箱变身私人音乐管家?
小爱音响音乐服务:如何让智能音箱变身私人音乐管家? 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否曾经想过,家里的小爱音…...
5分钟搞定:Mac用户制作Windows启动盘的终极指南
5分钟搞定:Mac用户制作Windows启动盘的终极指南 【免费下载链接】windiskwriter 🖥 A macOS app that creates bootable USB drives for Windows. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: https://g…...
开源字体实用指南:Poppins字体家族的全方位应用策略
开源字体实用指南:Poppins字体家族的全方位应用策略 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 价值定位:如何让开源字体成为项目的视觉资产&#x…...
用战神引擎开服后,别忘了这几步:服务器安全、日志监控与性能调优指南
战神引擎开服后的高阶运维指南:安全加固、日志监控与性能调优实战 当你成功用战神引擎架设传奇手游服务器后,真正的挑战才刚刚开始。服务器能跑起来只是第一步,如何让它跑得稳、跑得安全、跑得高效,才是区分普通服主和专业运维的关…...
CLIP-GmP-ViT-L-14工具实测:如何用图文匹配优化电商搜索与内容审核
CLIP-GmP-ViT-L-14工具实测:如何用图文匹配优化电商搜索与内容审核 1. 图文匹配技术的商业价值 在数字化商业环境中,图片和文字是两种最核心的内容载体。但长期以来,计算机系统很难真正理解两者之间的语义关联。CLIP-GmP-ViT-L-14模型的出现…...
东华OJ-基础题-48-数列1(C++)
问题描述 思维的严密性是相当重要的,尤其是在程序设计中,一个小小的错误,就可能导致无法想象的后果。明明的爸爸是一名富有经验的程序设计专家,深知思维严密的重要性。于是在明明很小的时候,就通过游戏的方式训练明明的…...

