用数组求解Josephus问题

来源:互联网 发布:big5输入法mac 编辑:程序博客网 时间:2024/05/09 05:18

      这是我学习数据结构做的第一小程序,哈哈,比较简单,但是我也想给大家一起分享。呵呵

 

 

 

2.5 试编写一个求解Josephus问题的函数。用整数序列123...,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用n=9,s=1,m=5,以及n=9,s=1,m=0,或者n=9,s=1,m=10作为输入数据,检查你的程序的正确性和健壮性。

 解答 #include "stdafx.h"

#include<stdlib.h>

#using <mscorlib.dll>

#include <iostream>

using namespace std;

 

void Josephus(int a[],int n,int s,int m);

int _tmain()

{      int i, n,m,s;

            cout<<"假设有n个人坐在圆桌的周围:"<<endl;

            cout<<"从第s个人开始数起,到第m个人的时候,出局"<<endl;

            cout<<"请输入n,s,m的值:"<<"";

            cin>>n>>s>>m;

            cout<<endl;

            int *a; //定义一个动态数组

            a=new int[n];

            if(a[n] ==NULL)

               {

                    cerr<<"内存分配错误!"<<endl;

               }

            if(m==0){

                          cerr<<"m=0是无效的参数!"<<endl;

                          cout<<"再次输入m的值:"<<endl;

                           cin>>m;

                        }

            Josephus(a,n,s,m);

            cout<<endl;

            cout<<"n个人出局的顺序:"<<endl;

            for(i=0;i<n;i++)  cout<<a[i]<<'/t';

            cout<<endl;

            delete[] a;

            return 0;

}  

  void Josephus(int a[],int n,int s,int m)//n个人围坐在一个圆桌周围,从第s个人开始报数,数到第m个人,让他出局

{

           int i,j,k,tmp;

           for(i=0;i<n;i++) a[i]=i+1;   //初始化,执行n

       i=s-1;               //报名起始位置

           for(k=n;k>=1;k--){         //逐个出局,执行n-1

                  if(i==k) i=0;

                  i=(i+m-1)%k;       //寻找出局的位置

                  if(i!=k-1){      

                     tmp=a[i];          //出局者交换到第k-1位置

                     for(j=i;j<k-1;j++) a[j]=a[j+1];

             a[k-1]=tmp;

                  }

     }

       for(k=0;k<n/2;k++){        //全部逆置,得到出局序列

              tmp=a[k];

              a[k]=a[n-k-1];

              a[n-k-1]=tmp;

         }

}