现在的位置: 首页 > 综合 > 正文

约瑟夫环两种解法

2018年03月16日 ⁄ 综合 ⁄ 共 1917字 ⁄ 字号 评论关闭

 

/*****Josephus 求解方法一:计数方法******/
void Josephus_1(int n,int m)
{
    int *array=new int[n];
    int *result=new int[n];
    int s,count;

    s=0;//记录出局人数
    count=0;//记数

    //赋初值
    for(int i=0;i<n;i++)
    {
        array[i]=i;
        result[i]=-1;
        cout<<i<<",";
    }
    cout<<endl;
    //循环遍历,计数到m就出局,s++
    while(s<n)
    {
        for(int i=0;i<n;i++)
        {
            if(array[i]==-1)
            {//表示此人已出局

            }else
            {
                count++;
                if(count==m)
                {
                    array[i]=-1;
                    result[s]=i;
                    s++;
                    count=0;
                }
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        if(array[i]!=0)
        {
            result[s]=i;
            break;
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<result[i]<<",";
    }
    cout<<endl;
    delete array;
    delete result;
}

/*****Josephus 求解方法二:采用循环链表******/
void Josephus_2(int n,int m,int k)
{
    node_t* pre=new node_t[n];
    node_t* tmp1=pre;
    node_t* tmp2=pre;

    int count_n=0;
    int count_m=0;
    int count_k=0;
    int *out=new int[n];

    cout<<"输出原始编号:";
    for(int i=0;i<n-1;i++)
    {
        tmp1->data=i+1;
        tmp1->next=pre+i+1;
        cout<<tmp1->data<<",";
        tmp1=tmp1->next;

        out[i]=-1;
    }
    out[n-1]=-1;
    tmp1->data=n;
    cout<<tmp1->data<<",";
    tmp1->next=pre;//链表的首尾相接
    cout<<endl;

    tmp1=pre;
    cout<<"模拟过程如下:"<<endl;
    while(count_n<n)
    {
        count_k=1;
        count_m=1;
        while(count_k<k)
        {//跳到第K个人
            count_k++;
            tmp1=tmp1->next;
        }

        while(count_m<m)
        {//数m个
            cout<<tmp1->data<<",";

            tmp2=tmp1;//记录下前一个,便于删除操作
            tmp1=tmp1->next;
            count_m++;
        }
        //输出出局
        cout<<tmp1->data<<endl;
        out[count_n++]=tmp1->data;

        //删除节点
        tmp2->next=tmp1->next;
        delete tmp1;

        tmp1=tmp2->next;
    }

    //输出出局顺序
    cout<<"出局顺序:"<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<out[i]<<",";
    }
    cout<<endl;

}

抱歉!评论已关闭.