Josephus问题

来源:互联网 发布:开淘宝店考试 编辑:程序博客网 时间:2024/05/21 09:30

使用C++解决Josephus问题:一群小孩围成一圈,任意假定一个间隔数interval,从第一个小孩数起,数到第interval个的时候,该小孩离开,依次这样数下去,最后一个小孩是胜利者,问:胜利者是第几个小孩?在运行时由用户输入小孩数,并进行输入检查,小孩数不能小于1,间隔数不能小于1,也不能大于小孩数,如果发现输入错误应该让用户选择:停止运行、重新输入、以默认值10个小孩间隔3让其运行。

本题关键就是结构体与链表的结合,,当访问到间隔数的小孩对象时,将这个对象的值--标记--为--0--,,再就是xxx和sss两个变量,前者控制间隔数,后者控制跳出的时机。

输出时借助一个循环,当结构体数组中元素的值不为0时,,输出此元素的值就OK了~~

#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>


using namespace std;


struct Node
{
    Node*pnext;
    int con;
};


int main()
{
    while(1 == 1)
    {
        int n,m;
        cin>>n>>m;
        if(n<1 || m<1 || n<m)
        {
            int pp = 3;
            cout<<"输入1重新输入、输入2停止运行、输入3则以默认值10个小孩间隔3运行"<<endl;
            cin>>pp;
            if(pp == 1)
                continue;
            else if(pp == 2)
                break;
            else if(pp == 3)
            {
                n = 10;
                m = 3;
            }
        }
        Node peo[n];
        Node *phead;
        for(int i = 0; i<n-1; i++)
        {
            peo[i].pnext = &peo[i + 1];
            peo[i].con = i + 1;
        }
        peo[n-1].pnext = &peo[0];
        peo[n-1].con = n;
        phead = &peo[0];
        int sss = 0;
        int  xxx = 0;
        while(phead != 0)
        {


            if(phead -> con != 0)
            {
                xxx++;
                if(xxx == m)
                {
                    phead -> con = 0;
                    xxx = 0;
                    sss++;
                }
            }
            if(sss == n-1)
                break;
            phead = phead -> pnext;
        }
        for(int j = 0; j<n; j++)
        {
            if(peo[j].con != 0)
            {
                cout<<peo[j].con<<endl;
            }
        }
    }
    return 0;
}

0 0
原创粉丝点击