约瑟夫问题
2015-10-23 23:44
507 查看
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
- 输入
- 每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0 - 输出
- 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
- 样例输入
- 6 2
- 12 4
- 8 3
- 0 0
- 样例输出
- 5
- 1
- 7
- 既然这题的归类是链表与指针,那首先就是用链表模拟啦,注意特殊情况如 N=1,M=1
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int next[3000]; int last[3000]; bool vis[3000]; int N,M; int now; int num; int cnt; bool jud; int main(){ for(;;){ memset(next,0,sizeof(next)); memset(last,0,sizeof(last)); memset(vis,false,sizeof(vis)); scanf("%d%d",&N,&M); if(N==1){ cout<<1<<endl; continue; } if(N==M&&M==0){ return 0; } for(int i=1;i<=N;i++){ if(i!=N) next[i]=i+1,last[i+1]=i; else next =1,last[1]=N; } now=num=1; jud=false; cnt=N; for(;;){ if(now==N+1) now=1; if(num==M&&vis[now]==false){ num=1; next[last[now]]=next[now]; last[next[now]]=last[now]; vis[now]=true; cnt--; if(cnt==1){ for(int i=1;i<=N;i++){ if(vis[i]==false){ cout<<i<<endl; jud=true; break; } } } if(jud==true) break; now++; } else if(vis[now]==true) now++; else if(vis[now]==false) now++,num++; } } return 0; }
还可以:
#include<iostream> using namespace std; int a[301]; int main(){ int n,m; while(1){ cin>>n>>m; if(m==0&&n==0) return 0; a[1]=0; for(int i=2;i<=n;i++){ a[i]=(a[i-1]+m)%i; } cout<<a +1<<endl; } }
相关文章推荐
- const_iterator
- 图解NodeJS【基于事件、回调的单线程高性能服务器】原理
- 第二百零四天 how can i 坚持
- domino 流程图的功能
- 【Unity】C#使用sqlite作为数据库解决方案思路
- Oracle Gateways透明网关访问SQL Server
- 学习中的菜鸟之异常处理
- SharedPreferences使用
- iOS生命周期简单演示
- Linux环境安装配置Swftools
- 05-doc-values-es控制聚合内存使用-elasticsearch权威指南翻译
- IOS开发 - 多线程 NSOperation
- 数组名和数组名取地址的区别
- LiteHttp 第十四节:回调监听器详解
- 04-fielddata-filtering-es控制聚合内存使用-elasticsearch权威指南翻译
- GoAhead 嵌入式web
- 【鸟哥的linux私房菜-学习笔记】Linux的档案权限与目录配置
- LiteHttp 第十三节:多层缓存机制及用法
- Spring MVC启动过程
- Genymotion启动时出现错误virtualization engine not found