CCF 202206-4 光线追踪 python

CCF官网题目
此题因为运行超时得到了30分,仅为没思路的同学提供一些想法,如果有改进建议欢迎评论!

题目分析

  1. 首先将反射镜转换为单独的反射点,去除反射镜的两端点。例如,反射镜(0,0)–(5,5)就可以转换为反射点(1,1),(2,2),(3,3),(4,4)。
    题目中说“平面中有一些激光光源,每个光源位于一个坐标为整数的点上,会向某个水平或竖直的方向发射一定强度的激光。”。由此可知,光线与反射镜相交时一定是位于一个整数点上,所以反射镜就可以进行离散化,这样可以将坐标系内的点提前进行标记是否为反射点,光源移动到达某个整数点只需要判断其是否为反射点,从而进行相应的操作。
  2. 每个光源单独追踪,以时间和光强进行控制,移动后判断是否到达反射点,更改其光向及光强。
    当到达设定时间阈值t或者光强I<1时,输出结果。本文提前将反射点加入字典point_dict,每次光源移动都要判断是否到达反射点。
    反射点根据其所在反射镜的方向可以分为两类,斜率为-1及1。光线与这两种反射镜相交后的方向改变需要分别进行讨论。
    而光源的移动,有上下左右四种情况,所以每个光源需要有一个参数—光向,这样就可以编程自动化了。
  3. 设置reflection、light两个类,并灵活使用python的字典数据结构。

代码

class reflection:def __init__(self, x1, y1, x2, y2, a):self.x1 = x1self.x2 = x2self.y1 = y1self.y2 = y2self.a = adef gradient(self):return (self.x1 - self.x2) / (self.y1 - self.y2)def insert_reflection(self):if self.x1 < self.x2:j = self.y1for i in range(self.x1 + 1, self.x2):if self.gradient() == 1:j = j + 1else:j = j - 1point_dict[(i, j)] = [self.gradient(), self.a]else:j = self.y2for i in range(self.x2 + 1, self.x1):if self.gradient() == 1:j = j + 1else:j = j - 1point_dict[(i, j)] = [self.gradient(), self.a]def remove_reflection(self):if self.x1 < self.x2:j = self.y1for i in range(self.x1 + 1, self.x2):if self.gradient() == 1:j = j + 1else:j = j - 1del point_dict[(i, j)]else:j = self.y2for i in range(self.x2 + 1, self.x1):if self.gradient() == 1:j = j + 1else:j = j - 1del point_dict[(i, j)]class light:def __init__(self, x, y, d, I, t):self.x = xself.y = yself.d = dself.I = Iself.t = tdef move(self):# d 的含义为:d = 0 表示沿 x 坐标增加的方向,d = 1 表示沿 y 坐标增加的方向,d = 2 表示沿 x 坐标减小的方向,d = 3 表示沿 y 坐标减小的方向if self.d == 0:self.x = self.x + 1elif self.d == 1:self.y = self.y + 1elif self.d == 2:self.x = self.x - 1else:self.y = self.y - 1def change_d(self, g):if g == 1:if self.d == 0:self.d = 1elif self.d == 1:self.d = 0elif self.d == 2:self.d = 3else:self.d = 2elif g == -1:if self.d == 0:self.d = 3elif self.d == 1:self.d = 2elif self.d == 2:self.d = 1else:self.d = 0def time_pass(self):while self.t > 0 and self.I >= 1:self.t = self.t - 1self.move()# 判断此时的(x,y)是否处于反射点 | 反射点的方向 1 或者 -1 | 修改dif (self.x, self.y) in point_dict.keys():reflection = point_dict[(self.x, self.y)]self.change_d(reflection[0])self.I = reflection[1] * self.Iif __name__ == "__main__":# 是否为反射镜point_dict = {}reflection_dict = {}m = int(input())# 1 x1 y1 x2 y2 a :反射系数为 a 的反射面# 2 k :删除第 k 个操作插入的反射面# 3 x y d I t :发射光线的方向为 d ,强度为 I ,求其所经 t 时刻后光线到达的坐标以及采样得到的光线强度for i in range(m):input_list = list(input().split())if int(input_list[0]) == 1:reflection_dict[i + 1] = reflection(x1=int(input_list[1]), y1=int(input_list[2]), x2=int(input_list[3]),y2=int(input_list[4]),a=float(input_list[5]))reflection_dict[i + 1].insert_reflection()elif int(input_list[0]) == 2:reflection_dict[int(input_list[1])].remove_reflection()else:light_temp = light(x=int(input_list[1]), y=int(input_list[2]), d=int(input_list[3]), I=float(input_list[4]),t=int(input_list[5]))light_temp.time_pass()if int(light_temp.I) == 0:print(0, 0, 0)else:print(light_temp.x, light_temp.y, int(light_temp.I))

结果

提交编号 用户名 姓名 试题名称 提交时间 代码长度 编程语言 评测结果 得分 时间使用 空间使用
3132778 佚名 佚名 光线追踪 08-01 19:52 4.078KB PYTHON 运行超时 30 运行超时 82.93MB

觉得不错,记得帮忙点个赞哟!

CCF 202206-4 光线追踪 python相关推荐

  1. 【CCF CSP】【Python】【201903-1】小中大

    [CCF CSP][Python][201903-1] 小中大 题目要求 代码实现 主要方法 提交验证 题目要求 代码实现 1.初始版(又名完全原创版.欠优化版.无法体现"人生苦短,我用PY ...

  2. ccf公共钥匙盒python_CCF python 201709-2 公共钥匙盒

    基本思路: 将所有的时间节点(借钥匙时间,还钥匙时间)组织到一个列表里[钥匙号,时间,借or还] 并将之按时间的升序.还优先借.钥匙号的升序排列 那么所要做的就是遍历这个列表: ····如果是借就 · ...

  3. CCF 201809-2 买菜 python

    题目 代码 # 201809-2 买菜# 输入 n=int(input()) line=[] maxt=0 for i in range(2*n):s,t=map(int,input().split( ...

  4. CCF CSP 201412-3 集合竞价 python

    201412-3 集合竞价 import sys records = []# ctrl+D stop for line in sys.stdin:record = line.split()record ...

  5. 201712-2 CCF认证考试 游戏 Python版

    第一题最小差值 满分答案: n,k = map(int,input().split()) m = n num = [[0 for i in range(2)]for j in range(n)] co ...

  6. 201612-1 CCF认证考试 中间数 Python版

    满分答案: n = int(input()) m = [0 for i in range(n)] m = input().split() number = 0 b = 0 s = 0 for i in ...

  7. ccf 认证 检测点查询(python)

    n,x,y=map(int,input().split()) ls=[] for i in range(n):a,b=map(int,input().split())c=((a-x)**2+(b-y) ...

  8. CCF 202112-2 序列查询新解 python 满分

    CCF 202112-2 序列查询新解 python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 01Python超时70分 02满分python思路 第一,计 ...

  9. CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page 阅读本题解前,您应当了解下列知识: 线段树 教程 C++ 标准库( ...

最新文章

  1. linux 内核 hook函数介绍
  2. Memcache缓存系统原理
  3. disk genius_如何预约Apple Store商店或Genius Bar
  4. html表单提交不判断,请问jquery有方法可以判断一个表单提交之后结果是成功或不成功吗?...
  5. [转载] 高级人工智能——第3章 约束推理
  6. 多重判断php d代码,phpd代码审计
  7. oracle的即时客户端,安装oracle即时客户端
  8. CV经典入门教程:《计算机视觉:算法与应用》第二版
  9. USB3014-应用程序开发(2)
  10. 堪比阿里插件的Android Studio插件集合(IDE通用)(下)
  11. 【技术】H5网页调用手机摄像头扫码
  12. [MtOI2019][奇汁淫巧]幻想乡数学竞赛
  13. 手撸Mybatis源码-基础版
  14. cocos creator-Assembler2D
  15. PHP开发API签名验证
  16. Redis集群单点故障:corrupted cluster config file.
  17. 绕过 office 宏密码保护
  18. 【渝粤题库】广东开放大学 发展与教育心理学 形成性考核
  19. 【C语言】街区最短路径问题解题思路
  20. 电子信息(非全)考研分析——大连理工VS哈工程

热门文章

  1. 炸裂!前浪老狗工作这5年遇到的面试题们,建议老铁们收藏研读
  2. Django的models中ORM
  3. 【机器学习】——逻辑模型:树模型(决策树)
  4. html5微信拍照后自动刷新,微信内置浏览器物理返回不刷新问题
  5. HTML网页入门练习——导航栏布局设计
  6. 用python写一个纪念日计算工具!有对象的特别注意了!
  7. python语义分割数据标签,将数字标签转彩色标签
  8. 操作系统总结(大全)
  9. value too long for type character varying(32)
  10. 观大局 | 出口转型企业必看,2021跨境产品需求分析报告火热出炉