C++博客-Tauruser-文章分类-算法与数据结构http://www.cppblog.com/Tauruser/category/1008.htmlEnjoy Every Dayzh-cnMon, 19 May 2008 19:06:36 GMTMon, 19 May 2008 19:06:36 GMT60Josephus问题递归方法2解决办法http://www.cppblog.com/Tauruser/articles/3751.htmlTauruserTauruserSun, 05 Mar 2006 07:17:00 GMThttp://www.cppblog.com/Tauruser/articles/3751.htmlhttp://www.cppblog.com/Tauruser/comments/3751.htmlhttp://www.cppblog.com/Tauruser/articles/3751.html#Feedback0http://www.cppblog.com/Tauruser/comments/commentRss/3751.htmlhttp://www.cppblog.com/Tauruser/services/trackbacks/3751.html/////////////////////////////////////////////////////////////////////////////
///          算法与数据结构 Josephus 问题解决方案          ///
///                用方法二递归进行出列运算源程序             ///
/////////////////////////////////////////////////////////////////////////////

#include <iostream>
using namespace std;

int n,s,m,count;//全局变量;count用来控制当前出列表的位置
int *seat,*outlist;//座位表与出列表
void out(int n,int s,int m,int *seat,int *outlist);//递归函数
int main()
{
    
//参数输入
    count=0;
    cout
<<"please input n:";
    cin
>>n;
    cout
<<"please input s:";
    cin
>>s;
    cout
<<"plesae input m:";
    cin
>>m;
    
    
//分配座位表与出列表空间
    seat=new int[n];
    outlist
=new int[n];
    
    
//将变量转化为系统内部index base 0;
    s--;
    
    
//对各座位上people的编号,出列表全清为零

    
for(int i(0);i<n;i++)
    
{
        seat[i]
=i+1;
        outlist[i]
=0;
    }

    
//递归进行出列运算
    out(n,s,m,seat,outlist);
    
    
//输出出列运算结果
    cout<<"the out people list is:";

    
for(int i=0;i<n;i++)
        cout
<<"P"<<outlist[i]<<" ";

    
//释放座位表与出列表空间
    delete []seat;
    delete []outlist;
    
return 0;

}


void out(int n,int s,int m,int *seat,int *outlist)
{
    
if(count==n) return;
    
else
    
{
        s
--;
        
for(int i(0);i<m;i++)
        
{
            s
++;
            
if(s==n) s=0;
            
if(seat[s]==0) i--;        
        }

        outlist[count]
=seat[s];//送入出列表
        count++;
        seat[s]
=0;//已经出列设置标志零
        out(n,s+1,m,seat,outlist);
    }

}


Tauruser 2006-03-05 15:17 发表评论
]]>
Josephus问题非递归方法2解决办法http://www.cppblog.com/Tauruser/articles/3750.htmlTauruserTauruserSun, 05 Mar 2006 07:13:00 GMThttp://www.cppblog.com/Tauruser/articles/3750.htmlhttp://www.cppblog.com/Tauruser/comments/3750.htmlhttp://www.cppblog.com/Tauruser/articles/3750.html#Feedback0http://www.cppblog.com/Tauruser/comments/commentRss/3750.htmlhttp://www.cppblog.com/Tauruser/services/trackbacks/3750.html 

/////////////////////////////////////////////////////////////////////////////
///          算法与数据结构 Josephus 问题解决方案          ///
///               用方法二非递归进行出列运算源程序             ///
/////////////////////////////////////////////////////////////////////////////


#include 
<iostream>
using namespace std;

int n,s,m;//全局变量
int *seat,*outlist;//座位表与出列表
int main()
{
    
//参数输入
    cout<<"please input n:";
    cin
>>n;
    cout
<<"please input s:";
    cin
>>s;
    cout
<<"plesae input m:";
    cin
>>m;
    
    
//分配座位表与出列表空间
    seat=new int[n];
    outlist
=new int[n];
    
    
//将变量转化为系统内部index base 0;
    s--;
    
    
//对各座位上people的编号,出列表全清为零

    
for(int i(0);i<n;i++)
    
{
        seat[i]
=i+1;
        outlist[i]
=0;
    }

    
    
//非递归进行出列运算
    s--;
    
for (int i(0);i<n;i++)
    
{
        
for(int j(0);j<m;j++)
        
{
            s
++;
            
if(s==n) s=0;
            
if(seat[s]==0) j--;
        }

        outlist[i]
=seat[s];//存入出列表
        seat[s]=0;//已经出列设置标志零

    }

    
    
//输出出列运算结果
    cout<<"the out people list is:";

    
for(int i=0;i<n;i++)
        cout
<<"P"<<outlist[i]<<" ";

    
//释放座位表与出列表空间
    delete []seat;
    delete []outlist;
    
return 0;

}


Tauruser 2006-03-05 15:13 发表评论
]]>
Josephus问题递归方法1解决办法http://www.cppblog.com/Tauruser/articles/3749.htmlTauruserTauruserSun, 05 Mar 2006 07:06:00 GMThttp://www.cppblog.com/Tauruser/articles/3749.htmlhttp://www.cppblog.com/Tauruser/comments/3749.htmlhttp://www.cppblog.com/Tauruser/articles/3749.html#Feedback0http://www.cppblog.com/Tauruser/comments/commentRss/3749.htmlhttp://www.cppblog.com/Tauruser/services/trackbacks/3749.html/////////////////////////////////////////////////////////////////////////////
///          算法与数据结构 Josephus 问题解决方案          ///
///               用方法一递归进行出列运算源程序              ///
/////////////////////////////////////////////////////////////////////////////


#include 
<iostream>
using namespace std;

int n,s,m;//设置全局变量
int *seat;//全局变量用于存储当前各位置上的人;seat no. base 0;
void out(int n,int s,int m,int *seat);//用于进行出列的递归函数

int main()
{    
    
//参数输入
    cout<<"please input n:";
    cin
>>n;
    cout
<<"please input s:";
    cin
>>s;
    cout
<<"plesae input m:";
    cin
>>m;
    
    
//分配座位表空间
    seat=new int[n];
    
//对各座位上people的编号
    for(int i(0);i<n;i++)
    
{
        seat[i]
=i+1;
    }


    
//将变量转化为系统内部index base 0;
    s--;
    
//方便需要
    m--;

    
//进行出列运算
    out(n,s,m,seat);

    
//输出出列运算结果
    cout<<"the out people list is:";

    
for(int i=n-1;i>=0;i--)
        cout
<<"P"<<seat[i]<<" ";
    
    
//释放座位数组空间
    delete []seat;
    
return 0;

}

void out(int n,int s,int m,int *seat)//用于进行出列的递归函数
{
    
int temp;
    
if(n==1)//递归退出条件 
        return;
    
else{
        
        s
=(s+m)%(n);//第S位被OUT,s base 0;
        if(s!=n-1)//当s=n-i-1时并不需要进行移位
        {
            temp
=seat[n-1];
            seat[n
-1]=seat[s];
            
for(int j=s;j<n-2;j++)
                seat[j]
=seat[j+1];
            seat[n
-2]=temp;
        }

        
out(n-1,s,m,seat);//递归调用
    }

}


Tauruser 2006-03-05 15:06 发表评论
]]>
Josephus问题非递归方法1解决办法http://www.cppblog.com/Tauruser/articles/3747.htmlTauruserTauruserSun, 05 Mar 2006 07:00:00 GMThttp://www.cppblog.com/Tauruser/articles/3747.htmlhttp://www.cppblog.com/Tauruser/comments/3747.htmlhttp://www.cppblog.com/Tauruser/articles/3747.html#Feedback0http://www.cppblog.com/Tauruser/comments/commentRss/3747.htmlhttp://www.cppblog.com/Tauruser/services/trackbacks/3747.html 

 1/////////////////////////////////////////////////////////////////////////////
 2///          算法与数据结构 Josephus 问题解决方案          ///
 3///               用方法一非递归进行出列运算源程序             ///
 4/////////////////////////////////////////////////////////////////////////////

 5
 6
 7#include <iostream>
 8using namespace std;
 9
10int n,s,m;//设置全局变量
11int *seat;//数组指针,指向各座位,注意这里以系统内部index base 0为准。
12int main()
13{
14    //参数输入
15    cout<<"please input n:";
16    cin>>n;
17    cout<<"please input s:";
18    cin>>s;
19    cout<<"plesae input m:";
20    cin>>m;
21    //分配座位表空间
22    seat=new int[n];    
23    //对各座位上people的编号
24    for(int i(0);i<n;i++)
25    {
26        seat[i]=i+1;
27    }

28
29    
30    //将变量转化为系统内部index base 0;
31    s--;
32    
33    //方便需要
34    m--;
35
36    int temp;
37
38    for(int i=0;i<n;i++)
39    {
40        s=(s+m)%(n-i);//第S位被OUT,s base 0;
41        if(s!=n-i-1)//当s=n-i-1时并不需要进行移位
42        {
43            temp=seat[n-i-1];
44            seat[n-i-1]=seat[s];
45            for(int j=s;j<n-i-2;j++)
46                seat[j]=seat[j+1];
47            seat[n-i-2]=temp;
48        }

49        
50    }

51    
52    //输出出列顺序表
53    cout<<"the out people list is:";
54    for(int i=n-1;i>=0;i--)
55        cout<<"P"<<seat[i]<<" ";
56    
57    //释放座位数组空间
58    delete []seat;
59
60    return 0;
61}


Tauruser 2006-03-05 15:00 发表评论
]]>