【精选】有趣的尝试,洛谷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:选中高级,点击字符集,点击修改成未设置,点击确定请添加图片描述

修改完成


五、总结与反思

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

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

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

请添加图片描述
提交结果

请添加图片描述

相关文章
|
算法 Java C语言
面试题精选:求根号2简单?高级算法你肯定不会(2)
这篇博客从立题到完成经历了好几天的时间,期间整理思路、编码、绘图、查阅资料、修改完善总累计耗时近8h。写作不易,如果文章对你有用欢迎素质三连(点赞、收藏加关注) 。
66 1
|
算法 Java 测试技术
面试题精选:求根号2简单?高级算法你肯定不会(1)
开始大家都以为这个算法是游戏的开发者Carmack发现的,但后来调查发现,该算法在这之前就在计算机图形学的硬件与软件领域中有所应用,如SGI和3dfx就曾在产品中应用此算法,所以至今都无人知晓这个算法是谁发明的。
60 1
|
机器学习/深度学习 物联网 C++
【LGR-(-17)】洛谷入门赛 #8个人思考
某 E 在 2022 年的幸运数字是 x xx,这个数可能是正的,也可能是负的。 某 E 想要知道 x   m o d   2023 x \bmod 2023xmod2023 的值。其中,  m o d   \bmodmod 是取模操作。也就是说,你需要求出 x xx 除以 2023 20232023 的余数,这个余数必须是非负整数。 例如,2022   m o d   2023 = 2022 2022 \bmod 2023 = 20222022mod2023=2022,2025   m o d   2023 = 2 2025 \bmod 2023 = 22025mod2023=2,− 2
336 0
|
机器学习/深度学习 人工智能 算法
牛客寒假算法基础集训营1 思考+题解
众所周知,2022年是四年一度的世界杯年,那么当然要整点足球题。本题需要你模拟一次点球大战。 假设对战双方为A和B,则点球大战中双方会按照ABABABABAB方式来罚点球,即两队交替罚点球、各罚五次、A队先罚。点球有罚进和罚不进两种结果,罚中的一方加一分。
103 0
|
机器学习/深度学习 人工智能 C++
C/C++之(三)洛谷刷题基础 上
C/C++之(三)洛谷刷题基础 上
270 0
C/C++之(三)洛谷刷题基础 上
|
机器学习/深度学习 C++
C/C++之(四)洛谷刷题基础
C/C++之(四)洛谷刷题基础
850 0
C/C++之(四)洛谷刷题基础
|
算法 Java
洛谷新手村算法题分析
本文汇总洛谷新手村算法题的分析解答,题目代码基本由Java实现。
122 0
洛谷新手村算法题分析
|
存储 算法 Java
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
算法学习入门Day1_Leetcode_70 爬楼梯 ~还是辣么滴丝滑 雀氏润
|
算法 程序员
力扣——算法入门计划第五天
力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。
力扣——算法入门计划第五天
|
算法 程序员 Python
力扣——算法入门计划第四天
力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。
力扣——算法入门计划第四天