开灯问题-----双重循环及dfs解法

E4CAB753-B41A-48FE-A387-D60B9FCDABC5.PNG 立即下载

一.题目
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开, 开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?
输入:n和k,输出开着的灯编号。k≤n≤1000。
样例输入:7 3
样例输出:1 5 6 7

二.思路
看到这个问题,我继续想尝试昨天的dfs,看了看情况,感觉可以…;要是没有dfs的话,那就直接双重循环解决问题…

三. 代码
第一种,dfs:

#include <stdio.h>

int book[1001];

void dfs(int step,int k,int n)
{
    int j;
    if(step == k+1)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            if(book[i]==1)
            {
                printf("%d ",i);
            }
        }
        return ;
    }
    for(j=step;j<=n;j++)   //灯
    {
        int i;

        if(j%step==0)
        {
            if(book[j]==0)  book[j]=1;
            else  book[j]=0;
        }
    }
    dfs(step+1,k,n); //这里的递归要在for外面进行,因为它不是要一直在循环内的。
}
int main ()
{
    int n,k;
    scanf("%d%d",&n,&k);
    dfs(1,k,n);
    return 0;
}

第二种,双重循环解决问题

#include <stdio.h>
int a[1001];

int main ()
{
    int n,k;
    scanf("%d%d",&n,&k);
    int i,j;
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(j%i==0)  a[j] = !a[j]; //这一步直接用 !,十分省事,也很巧妙
        }
    }
    for(i=1;i<=n;i++)
    {
        if(a[i])    {printf("%d ",i);}
    }
    return 0;
}

四.总结:
书本上提供的代码有两个小技巧:
1. 利用memset(a,0,sizeof(a)); 进行全部赋值
2. 利用标志变量来控制要不要空格

ASTM D4583-21(2025).pdf ASTM D4583-21(2025) 立即下载

相关推荐

Streaming-Speech-Recognition-Privacy-Boundary-Auditor-v1.0-原创源码与文档.zip

原创 JavaScript 工程工具合集条目,包含完整源码、README、MIT License、原创与授权声明、3 项自动化测试、可复现合成示例、离线 HTML/JSON/SVG 报告 1080×720 真实运行效果图。Node.js 18+ 可直接运行,零第三方运行依赖,适合开发者用于数据校验、工程审计、容量规划与交付复核。热点仅作为需求信号,不含榜单项目源码、模型权重、品牌素材或官方截图。

利用递归来模拟多重嵌套循环.

利用递归来模拟多重嵌套循环 如以下循环: 1 2 3 4 5 6 for(inti=0;i<100;i++) for(intj=0;j<100;j++) for(intk=0;k<100;k++){ System.out.p...

静无需言 7151

CAD+ËÃÊ×¶ÉÁ»»¼²¼É¼¼ÐÄÊÑ

CAD+ËÃÊ×¶ÉÁ»»¼²¼É¼¼ÐÄÊÑ

多重循环(4次以上)用递归的方法实现

#include &lt;cstdio&gt; int ans=0; void dfs(int i) { if(i==9)//退出条件 { ans++; return; } for(int j=0;j&lt;5;j++)//水平循环 { dfs(i+1); } } int main() { dfs(0); printf("%d",ans);//9层循环每层循...

qq_35576225的博客 3113

dfs中防止重复访问/回溯用到的两种方法的区别

防止所有层的重复访问 通过visted[i]或者used[i]的置位复位,标记 def __dfs(self, nums, visited, depth=0, pre=[], output=[]): if depth == len(nums): output.append(pre[:]) return for i...

hunjiancuo5340的博客 916

点灯游戏求解算法(DFS)——老子表示不理解!也不看了!

#include #include const int Row=4,Col=4; int status[Row][Col]={ 1,0,0,0, 0,1,1,1, 0,1,1,1, 0,1,1,1 }; int minstep=200; int nowstep=0; int steps[200]; int beststeps[200]; void click(int

Ben_OnceMore 4784

数据结构之图(2):图的遍历,深度优先算法(DFS广度优先算法(BFS)

一、什么是图的遍历 给定一个图G其中任意一个顶点v0,从v0出发,沿着图中的各边访问图中的所有顶点,且每个顶点仅被访问一次。 遍历的方法: 深度优先搜索、广度优先算法、前序、后序 为了防止陷入死循环(存在回路)或者访问不到某些结点(非联通图),我们在每个顶点设置一个访问标志位(visit bit)初始为零,被访问后标记。 图的生成树:图的所有顶点再加上遍历过程中经过的所有边所构成的子图,称为...

qq_43342413的博客 503

开灯问题C++版

开灯问题 有n盏灯,编号为1~n。第一个人把所有灯打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),以此类推。一共有k个人,问最后有那些灯开着?输入:nk,输出开着灯的编号。k&lt;=n&lt;=1000。       样例输入:7 3       样例输出:1 5 6 7 #include&...

sinat_35793960的博客 8717

蓝桥杯 算法提高 开灯游戏(dfs)

感觉最近对dfs用的越来越熟,还是熟能生巧啊。 这题采用dfs的方法,每盏灯考虑开或者不开(用01表示)。要求考虑字典序,所以优先考虑不开。 #include<iostream> using namespace std; int light[10];//0熄灭,1亮 int control[][4]={ 0,0,0,0, 2,4,0,0, 1,3,5,0, 2,6,0,0, 1,5...

weixin_44667597的博客 479

开关灯问题

描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:nk,输出开着的灯编号。k≤n≤1000 输入输入一组数据:nk输出输出开着的灯编号样例输入 7 3 样例输出 1 5 6 7 思

cyh 9600

2018 蓝桥杯省赛 B 组模拟赛(一)-----开关灯

蒜头君今天回到了老家的大宅院,老家的灯还是那中拉线的灯(拉一次为亮,再拉一次就灭),蒜头君觉得无聊。把 10001000 盏灯 33 的倍数拉了一次,55的倍数拉了一次,7的倍数拉了一次(灯得的编号从 1-10001−1000,灯的初始状态都是亮的)。这个时候蒜头君在想还剩下几盏灯还在亮着? 提示:请不要输出多余的符号。 要注意,先把3的倍数拉了,再拉5的倍数,最后拉7的倍数。 因为假...

Romantic Chopin in C Sharp Minor 783

技术转移机构如何高效评估技术成果的价值?.docx

技术转移机构如何高效评估技术成果的价值?

科技园区如何精准招引高潜力科创项目并提升招商效率?.docx

科技园区如何精准招引高潜力科创项目并提升招商效率?

高校如何提升科研项目评价的科学性与效率?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

国央企如何优化重大科技项目的决策与资源分配?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

4波气弦第四次论证:P vs NP.pdf

4波气弦第四次论证:P vs NP

【C语言基础】第三讲:分支循环

内容概要:本文详细讲解了C语言中的分支与循环结构,涵盖if、if-else、switch、while、for、do-while等核心语法,并深入介绍逻辑操作符、关系操作符、条件操作符及break、continue、goto的使用方法。通过大量可直接运行的代码示例,帮助初学者掌握程序的流程控制。文章最后以“猜数字游戏”作为综合案例,融合随机数生成(rand/srand/time)、循环控制与分支判断,强化知识点的实际应用能力。同时提供多个课堂练习,如判断三角形、简易计算器、水仙花数、九九乘法表最大公约数等,全面提升编程实践水平。; 适合人群:面向C语言初学者,尤其是刚接触编程或有一定基础、希望系统掌握流程控制结构的研发学习者;适合工作1年内的新人或计算机相关专业学生; 使用场景及目标:①系统学习C语言中分支与循环的核心语法及其执行机制;②理解并熟练运用条件判断、循环嵌套、流程跳转等编程技巧;③通过猜数字游戏等综合项目提升代码整合与逻辑设计能力; 阅读建议:建议边学边练,配合Visual Studio等开发环境动手调试文中所有代码,重点关注“悬空else”、“switch穿透”、“循环中的continue陷阱”等易错点,深入理解短路求值与goto的合理使用场景,确保理论与实践相结合。

上一篇: 排列 ----dfs算法
下一篇: 蛇形填数(扩充版)
Tket
博客等级 码龄9年 21粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值