Josephus問題的C++新解法

字號(hào):

Josephus.h
    class Josephus
    {
    public:
    void OutControl(int num,int begin,int interval);
    protected:
    int num;
    int begin;
    int interval;
    };
    List.h
    struct People
    {
    int number;
    People *next;
    };
    class List
    {
    public:
    List (int num)//初始化point->number
    {
    josephus = new People[num];
    point = josephus;
    for(int i=1;i<=num;i++)
    {
    point->number = i ;
    point->next = josephus + i % num; /*利用+1取模的方式設(shè)置節(jié)點(diǎn)的next指針,
    當(dāng)?shù)阶詈蟮臅r(shí)候自動(dòng)指向到第一個(gè),形成環(huán)鏈 */
    point = point->next;
    }
    point = &josephus[num-1]; //把起始指針設(shè)置在最后一個(gè)節(jié)點(diǎn),當(dāng)進(jìn)入循環(huán)的時(shí)候就會(huì)從0開始,
    }
    ~List()
    {
    delete[] josephus; //返回堆內(nèi)存空間
    }
    void Change (int num, int begin);
    void Count(int interval);
    void Output();
    void Show();
    protected:
    People *josephus;
    People *point;
    People *cut_point;
    };
    Josephus.cpp
    #include
    #include "Josephus.h"
    #include "List.h"
    using namespace std;
    void Josephus::OutControl(int num,int begin,int interval) //調(diào)用List的成員函數(shù),依次輸出出列的號(hào)碼
    {
    List in(num);
    in.Change (num, begin);
    cout<<"依次出列次序?yàn)?";
    for(int i=1;i<=num;i++)
    {
    in.Count(interval);
    in.Show();
    in.Output();
    }
    cout<    }
    List.cpp
    #include
    #include "List.h"
    using namespace std;
    void List::Change (int num, int begin) //設(shè)置起始指針的位置
    {
    if (begin==1)
    point=&josephus[num-1];
    if (begin>=2)
    point=&josephus[begin-2];
    }
    void List::Count(int interval) //通過循環(huán)不斷的尋找需要放棄的節(jié)點(diǎn)
    {
    for(int i=0;i    {
    cut_point = point;
    point = cut_point->next;
    }
    }
    void List::Show() //打印號(hào)碼
    {
    cout<number<<".";
    }
    void List::Output() //使不需要的節(jié)點(diǎn)脫離
    {
    cut_point->next = point->next;
    point=cut_point;
    }
    main.cpp
    #include
    #include "Josephus.h"
    using namespace std;
    void main()
    { int num,begin,interval;
    cout<<"請輸入總?cè)藬?shù):";
    cin>>num;
    if(num<2)
    {
    cout<<"錯(cuò)誤!總?cè)藬?shù)不能小于2!";
    return;
    }
    cout<<"請輸入開始號(hào)碼:";
    cin>>begin;
    if(begin<1||begin>num)
    {
    cout<<"錯(cuò)誤!開始號(hào)碼不能小于1或大于總?cè)藬?shù)!";
    return;
    }
    cout<<"請輸入間隔:";
    cin>>interval;
    if(interval<1||interval>num)
    {
    cout<<"錯(cuò)誤!間隔不能小于1或大于總?cè)藬?shù)!";
    return;
    }
    Josephus in;
    in.OutControl(num,begin,interval);
    cin.get ();
    cin.get ();
    }