C语言通过双向循环链表解决Josephus(约瑟夫)问题的代码

下面代码段是关于C语言通过双向循环链表解决Josephus(约瑟夫)问题的代码,希望能对各朋友也有用处。

#include
using namespace std ;
class node
{
public:
int element ;
node( )
{
last = next = NULL ;
element = 0 ;
}
node( int element )
{
last = next = NULL ;
this->element = element ;
}
} ;
void func( int n , int m , int s )
{
if( n == 1 )
{
printf( “1/n” ) ;
}
else if( n == 2 )
{
if( m & 1 )
{
printf( “%d %d/n” , s , 3 - s ) ;
}
else
{
printf( “%d %d/n” , 3 - s , s ) ;
}
}
else
{
int size = n , cnt = 1 ;
if( s == 1 )
{
start_pointer = current ;
}
for( int i = 2 ; i <= size ; i ++ )
{
node_pointer tmp = new node( i ) ;
current->next = tmp ;
tmp->last = current ;
current = tmp ;
if( ++ cnt == s )
{
start_pointer = current ;
}
}
current->next = head ;
head->last = current ;

    current = start_pointer ;
    cnt = 1 ;
    while( true )
    {
        if( cnt == m )
        {
            if( size  >= 3 )
            {
                printf( "%d " , current->element ) ;
                node_pointer tmp1 = current->last ;
                node_pointer tmp2 = current->next ;
                tmp1->next = tmp2 ;
                tmp2->last = tmp1 ;
                
                delete current ;
                current = tmp2 ;
                cnt = 1 ;
                
                size -- ;
            }
            else if( size == 2 )
            {
                printf( "%d " , current->element ) ;
                node_pointer tmp = current->next ;
                tmp->last = tmp->next = tmp ;
                
                delete current ;
                current = tmp ;
                cnt = 1 ;
                
                size -- ;
            }
            else if( size == 1 )
            {
                printf( "%d/n" , current->element ) ;
                delete current ;
            }
        }
        else
        {
            current = current->next ;
            cnt ++ ;
        }
    }
}

}
int main()
{
while( scanf( “%d%d%d” , &n , &m , &s ) == 3 )
{
func( n , m , s ) ;
}
return 0 ;
}

给出几组样例:1053728411036952232211111注:此程序默认输入合理。即n>0,m>0,1<=s<=n。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值