约瑟夫环问题
来源:互联网 发布:袁立 知乎 编辑:程序博客网 时间:2024/05/16 03:12
题目链接:http://acm.pdsu.edu.cn/problem.php?cid=1058&pid=3
题目描述
有n青蛙围成一圈,顺序排号。从第1个青蛙开始报数(从1到3报数),凡报到3的青蛙退出圈子,问最后留下的青蛙是原来的第几号的那个青蛙。
输入
初始青蛙数n
输出
最后一青蛙的初始编号
样例输入
3
样例输出
2
题意:
约瑟夫环,在n个人里面数数,数到3的人自杀,然后从一开始数,输出最后一个自杀的人的编号。
解题思路:
本题难点就在于怎么重新开始数数,还有怎么让数到三的人自杀,用%来控制下标,也就是每个人的编号,用1和0来控制是否自杀。
代码详解:
#include<stdio.h>
int main()
{
int b[10000],j,i,n,x=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
b[i]=1;//值为1就是还活着;
}
j=0;
for(i=n;i>1;)
{
if(b[j]==1)
x++;//控制自杀的人;
if(x%3==0&&b[j]!=0)//每数到三的意思就是,是三的倍数就自杀;
{
b[j]=0;//b[i]=0的意思就是自杀,自杀以后,值变为0;
i--;
}
j=(j+1)%n;//控制下标为0~(n-1),然后一直循环;
}
for(i=0;i<n;i++)
{
if(b[i]==1)//找到没有自杀的那一个人的编号;
break;
}
printf("%d",i+1);
return 0;
}
int main()
{
int b[10000],j,i,n,x=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
b[i]=1;//值为1就是还活着;
}
j=0;
for(i=n;i>1;)
{
if(b[j]==1)
x++;//控制自杀的人;
if(x%3==0&&b[j]!=0)//每数到三的意思就是,是三的倍数就自杀;
{
b[j]=0;//b[i]=0的意思就是自杀,自杀以后,值变为0;
i--;
}
j=(j+1)%n;//控制下标为0~(n-1),然后一直循环;
}
for(i=0;i<n;i++)
{
if(b[i]==1)//找到没有自杀的那一个人的编号;
break;
}
printf("%d",i+1);
return 0;
}
阅读全文
0 0
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- vmware虚拟机上ubuntu不能连上外网解决办法
- 【洛谷P1001 A+B Problem--100分】
- 《深入理解mybatis原理》 MyBatis的二级缓存的设计原理
- Codeforces897B Chtholly's request
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
- 约瑟夫环问题
- zookeeper下载安装
- Unity实现在白板上绘画涂鸦
- gitignore常见配置
- search-insert-position/search-in-rotated-sorted-array/search-in-rotated-sorted-array ii
- 善用 ApacheAB 和 VisualVM, 做开发阶段代码性能调优
- Ubuntu 16.04找不到语言支持的解决办法以及安装搜狗输入法
- Hibernate的学习之路二十二(一对多的级联删除)
- 如果创建工程的时候没有勾选Unit Test选项,如何创建单元测试 正确删除test target