下面代码段是关于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。