【精选】有趣的尝试,洛谷P6159光图(让算法动一动)

简介: 【精选】有趣的尝试,洛谷P6159光图(让算法动一动)

# 【精选】有趣的尝试,洛谷P6159光图(让算法动一动)


视频展示

程序展示

光图程序链接展示

程序制作

光图制作链接展示


题目介绍(题目来源于洛谷)以下是洛谷P6159光图

[Cnoi2020]光图

题目背景

简洁中蕴含着伟大。

Cirno 不经意地把一个内部完全反射的圆分成了 $12$ 等分,等分点分别记作 $A_0$, $A_1$, $A_2$, $\cdots$ , $A_{11}$。

随后,她不经意地将一束光从一点发出,朝向另一点,重复,反射,迭代,便得到了一幅美妙的光图。

这一切都发生在不经意之间。

她不经意地发现了这一幕,并且不经意地记下了这个不经意的结论,又在某一刻不经意地回忆起。

幻想乡的每一天一切都是这么不以为意,多好的一天啊!

题目描述

Rumia 有一个单位圆,被分成 $n$ 等分,等分点分别记作 $A_0$, $A_1$, $A_2$, $\cdots$ , $A_{n-1}$。

现在她从 $A_0$ 向 $A_p$ 发射一束光,经过 $k$ 次反射,到达了 $A_t$。

Rumia 想知道 $t$ 的值,由于 Cirno 并不想帮她,所以 Rumia 转而求助于你。

输入格式

一行,三个整数,$n,p,k$。

输出格式

一行,一个整数 $t$。

样例 #1

样例输入 #1

12 5 2

样例输出 #1

10

样例 #2

样例输入 #2

1000 342 3472844

样例输出 #2

648

提示

Sample1 解释

后置物理知识

  • 连续曲线反射规律 : 入射光线与出射光线关于入射点在曲线上切线夹角相等。

数据范围约定

「本题采用捆绑测试」

  • Subtask1( $80\%$ ) : $n, k \le 10^6$
  • Subtask2( $20\%$ ) : $n, k \le 10^9$

对于 $100\%$ 的数据 : $0 < p < n \le 10^9$, $0 < k \le 10^9$。

后记

  • Cirno 得到的光图就是传说中的十二芒星图


一、项目环境

1.Visual Studio 2022
2.安装easyx图形库,可以调用头文件

include<easyx.h>


简单介绍一下easyx图形库

EasyX库是一个基于C语言的图形界面库,可以用于Windows操作系统下的图形界面应用程序开发。该库提供了一些易于使用的图形绘制函数和简单的事件处理功能,可以帮助开发者快速地创建各种图形应用程序,如游戏、图形编辑器等。
EasyX库提供了丰富的绘图功能,如直线、矩形、圆形、椭圆、多边形等基本形状的绘制,同时还支持图片、文字、音频等多种媒体资源的加载和处理。此外,EasyX库还支持鼠标、键盘等多种事件的处理,可以让用户与应用程序进行交互。
EasyX库的另一个特点是易于学习和使用。它提供了简单的API,使得初学者也可以轻松地入门,并且具有丰富的在线文档和示例程序,帮助开发者快速地学习和理解如何使用这个库。除此之外,EasyX库还可以和Visual Studio等常见的集成开发环境进行配合使用,使得开发工作更加高效。
总之,EasyX库是一款简单易用、功能强大的图形界面库,适用于初学者和有一定编程基础的开发者,可以用于快速开发各种图形应用程序。

Easyx图形库

点击此处跳转到Easyx下载官网


二、项目介绍

通过算法,结合easyx库本章将洛谷光图这道题进行了算法可视化,可以更加清晰的看出光在算法的加持下是如何反射的。


三、运行效果展示

测试页面
请添加图片描述
输入样例1:
24
5 2
效果如下图所示:
请添加图片描述


四、项目源代码分享

#include<stdio.h>
#include<iostream>
#include<easyx.h>
#include<math.h>
#include<graphics.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
/*
输入12的倍数尽量小一点,大了就是一个圆形看不出什么
输入
24
5 2
*/
using namespace std;
#define maxx 100001
#define PI 3.14159265358979323846264338
struct spot {//声明一个点类
    long double x;//点的横坐标
    COLORREF color;
    long double y;//点的纵坐标
}s;
struct stop1 {
    spot data[maxx];
}poin;
//打印,连线
void Connection(int n,int p,int k)//被分成n份,从0点到p点,反射k次
{
    for (int i = 2; i <= n; i++)
    {
        int t1 = k * p % n;//反射k次的最后所在点
        int t2 = (k-1) * p % n;//反射k-1次的最后所在点
        setlinecolor(RED);
        line(poin.data[t1].x, poin.data[t1].y, poin.data[t2].x, poin.data[t2].y);
    }    
}
int main()
{
    initgraph(1000, 800, EW_SHOWCONSOLE);
    setbkcolor(WHITE);
    cleardevice();
    setlinecolor(BLACK);
    setlinestyle(PS_SOLID,6);
    setfillcolor(BLACK);
    circle(500, 400, 300);
    int i;
    int n, p, k;
    cin >> n ;
    int r = 300;
    int  oneAngle = 360 / n;// N等分后每个角度的度数
    int  centerX = 500; // 圆心坐标--X
    int  centerY = 400;// 圆心坐标--Y
    int  radius = 300;// 半径
    for (int i = 0; i < maxx; i++) {
        int tmp = i * oneAngle;
        poin.data[i].x = (centerX + radius * cos(tmp * PI / 180));
        poin.data[i].y = (centerY + radius * sin(tmp * PI/ 180));
        setfillcolor(RED);
        solidcircle(poin.data[i].x, poin.data[i].y, 3);
        //cout << poin.data[i].x << " " << poin.data[i].y << endl;
        //cout << i << "**************************" << endl;
    }
    cin >> p >> k;
    int t1, t2;
    int ok;
    while (1)
    {
        k++;
        for (int i = 2; i <= n; i++)
        {
            t1 = k * p % n;//反射k次的最后所在点
            t2 = (k - 1) * p % n;//反射k-1次的最后所在点
            poin.data[i].color = HSVtoRGB((float)(rand() % 360), 0.8f, 0.9f);
            setlinecolor(poin.data[i].color);
            line(poin.data[t1].x, poin.data[t1].y, poin.data[t2].x, poin.data[t2].y);
            printf("poin.data[%d].x=%lf poin.data[%d].y=%lf\n", t1, poin.data[t1].x, t1, poin.data[t1].y);
            printf("poin.data[%d].x=%lf poin.data[%d].y=%lf\n", t2, poin.data[t2].x, t2, poin.data[t2].y);
            printf("/**---------------------------------------**/\n");
            //Sleep(1);
        }
        if (k-2 == n)
        {
            //cin >> ok;
            //cin >> p >> k;
            p++;
            k = 5;
        }
    }
    getchar();
    closegraph();
    return 0;
}

注意:

这里要提前在Visual Studio中修改一些设置,否则代码将无法顺利运行

修改方法如下:

Step1:在项目中点击鼠标右键,点击属性
请添加图片描述
Step2:选中高级,点击字符集,点击修改成未设置,点击确定请添加图片描述

修改完成


五、总结与反思

本文是博主在寒假期间写洛谷题时的突然有感,算法题总是让人感到枯燥无味,但经过博主这样的修改是不是觉得枯燥无味的算法也增加了一丝丝的色彩,有没有让各位猿子们对算法的热情增加一丝丝呢🤭

番外(如果单纯为了看本题的题解可以看以下内容)

浅浅写一下当时在洛谷提交这道题的算法

请添加图片描述
提交结果

请添加图片描述

相关文章
|
存储 弹性计算 Docker
深入探讨Docker的主要功能及其影响力
【8月更文挑战第24天】
324 0
|
SQL 自然语言处理 数据库连接
使用vanna实现Text2SQL
这篇文章介绍了如何使用Vanna将自然语言转换为SQL查询,包括安装Vanna、配置数据库连接以及运行查询的全过程。
1106 0
|
传感器 编解码 Linux
V4L2框架 | MIPI Camera指令调试笔记
V4L2框架 | MIPI Camera指令调试笔记
6247 2
|
开发者
全网最全最简单使用easypoi导入导出Excel的操作手册(二)
今天做Excel导出时,发现了一款非常好用的POI框架EasyPoi,其 使用起来简洁明了。现在我们就来介绍下EasyPoi,首先感谢EasyPoi 的开发者 Lemur开源
10942 1
全网最全最简单使用easypoi导入导出Excel的操作手册(二)
|
Web App开发 Ubuntu 开发工具
工作环境换成Ubuntu18.04小记
原文:工作环境换成Ubuntu18.04小记 Linux汇总:https://www.cnblogs.com/dunitian/p/4822808.html#linux Ubuntu常用软件安装(小集合)http://www.
3572 0
|
3天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
9天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
8天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
8天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。