猴子选大王(约瑟夫环问题)两种解决方案
2011-11-17 11:19
288 查看
问题:
示例:
有M只猴子围成一圈,按序每只从1到M中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,数到N的猴子出圈,最后剩下来的就是大王。要求:从键盘输入M、N,编程计算哪一个编号的猴子成为大王
示例:
比如有5只猴子,从1到3报数,则选大王的步骤如下: 第一次报数:1->2->3 //3淘汰出圈 第二次报数:4->5->1 //1淘汰出圈 第三次报数:2->4->5 //5淘汰出圈 第四次报数: 2->4->2 //2淘汰出圈 4号称王。 // monkey.cpp : Defines the entry point for the console application. // 方案一:;利用数组
#include "stdafx.h" #include <iostream> using namespace std; int findMonkeyKing(int m,int n){ int* a= new int[m]; //将猴子按从1到m编号 for(int i=1;i<=m;i++){ a[i-1]=i; } int start=0;//第一次报数从第一只猴子开始 int count=n;//记录报数的次数 int len=m;//记录数组的大小 while(m>1){ while(count>1){ if(a[start]>0){ count--; if((start+1)<len) start++; else start=0; } else { if(start+1<len) start++; else start=0; } } //找到要淘汰出圈的猴子 while(a[start]==0){ if(start+1<len) start++; else start=0; } //cout<<a[start]<<"_"<<start<<endl; a[start]=0;//将该猴子淘汰。 //找到下一个开始从1报数的猴子 while(a[start]==0){ if(start+1<len) start++; else start=0; } //cout<<a[start]<<"_"<<start<<endl; count=n;//为下次循环做准备 m--; } //找到数组中仅存的值不为0的数组元素即为所选猴子大王 int j=0; while(a[j++]==0); return a[j-1];//这个地方要小心,要后退一步 } int main(int argc, char* argv[]) { int m,n; cout<<"请输入猴子的总只数m:"; cin>>m; cout<<endl; cout<<"请输入报数的次数n:"; cin>>n; cout<<endl; int monkeyKing=findMonkeyKing(m,n); cout<<"第"<<monkeyKing<<"号猴子是大王"<<endl; return 0; }
相关文章推荐
- 08年以前华中科大机试第8道题目(约瑟夫环问题(传说中的猴子选大王))
- 猴子选大王(约瑟夫环问题)
- 猴子选大王问题(约瑟夫环)
- 循环链表实现Joseph环(约瑟夫环)猴子选大王类似问题
- 猴子选大王(约瑟夫环问题)的OO解法
- 约瑟夫环 猴子选大王的问题
- WV.11-猴子选大王(约瑟夫环问题)
- 猴子选大王问题(约瑟夫环)
- 约瑟夫环问题之例-----猴子选大王
- 单链表实现猴子选大王(约瑟夫环问题)
- 借助链表解决猴子选大王问题(约瑟夫环问题)
- 线性表——猴子选大王问题
- Java猴子选王问题(约瑟夫环)
- 猴子选大王(约瑟夫环的使用,第一个不是报数人)
- 约瑟夫问题 之Java两种解决方案
- 约瑟夫环问题的两种解法(详解)
- 猴子选大王-约瑟夫环
- 约瑟夫环问题的两种实现[链表+数组]
- 约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)
- poj-约瑟夫问题(猴子选大王)