josephus问题其实就是一个游戏,一群小孩围成一个圈,设置一个数,这个数是个小于小孩总数大于0的一个整数,从第一个小孩开始报数,当其中一个小孩报到你设置的那个数的时候离开那个圈,这样一来反复报下去,直到只剩下最后一个小孩的时候那个小孩就是胜利者,写程序来找出这个小孩
class Josephus { public: Josephus(int numofInput=10,int intervalofInput=1) { num = numofInput; interval = intervalofInput; } void initial(); protected: int num; int interval; };
#include <iostream> #include "josephus.h" #include "ring.h" using namespace std; void Josephus::initial() { int num,interval; cout<<"请输入孩子总数:"; cin>>num; if(num<2) { cout<<"孩子总数不能小于2,否则不能构成环链!"; return; } cout<<"请输入抽选号码"; cin>>interval; if(interval<1|interval>num) { cout<<"请输入抽选号码不能小于1或者大于小孩总数!"; return; } Josephus::num=num; Josephus::interval=interval; Ring a(num); a.ShowRing(num); cout<<endl; //前面算是一个初始化的工作 for(int i=1;i<num;i++) //这边才是开始做游戏,要做num - 1次才能得出最后结果 { a.CountInterval(interval); //开始数数 a.ShowWiner_loser(); //看是那个小孩要被剔除 a.OutChild(); //将出去的小孩剔除 } cout<<endl<<"胜利者是:"; a.ShowWiner_loser(); }
struct Children { int number; Children *next; }; class Ring { public: Ring(int num) { josephus = new Children[num]; //josephus保存数组的首元素首地址 point = josephus; for(int i=1;i<=num;i++) { point->number = i; //从1到num对数组进行标号 point->next = josephus + i % num; point=point->next; } point = &josephus[num-1]; //point指向最后一个小孩 } ~Ring() { delete[] josephus; } void ShowRing(int num); void CountInterval(int interval); void OutChild(); void ShowWiner_loser(); protected: Children *josephus; Children *point; Children *cut_point; };
#include <iostream> #include "ring.h" using namespace std; void Ring::ShowRing(int num) { point=josephus;//也可以写成point=point->next;但前着效率高一点点 for(int i=1;i<=num;i++) { cout<<point->number<<","; point=point->next; } point=&josephus[num-1];//输出过后恢复point应该在的位置 } void Ring::CountInterval(int interval)//数小孩 { for(int i=0;i<interval;i++) { cut_point = point; point = cut_point->next; } } void Ring::OutChild() { cut_point->next = point->next;//将不要节点断离 point=cut_point; } void Ring::ShowWiner_loser() { cout<<point->number<<","; }
#include <iostream> #include "josephus.h" using namespace std; void main() { Josephus a; a.initial(); }
|