关闭

约瑟夫环问题单循环链表解法

1834人阅读 评论(0) 收藏 举报

约瑟夫环问题

Time Limit:1000MS  Memory Limit:65536K
Total Submit:50 Accepted:8

Description

约瑟夫环问题;有N个人围成一个环,从第一个人开始报数,报到M的人退出环,并且由他的M值来代替原有的M值,要求输出离开环的顺序。

Input

第一行有2个数,M和N。(0<N<=1000)
第二行有N个数,表示每个人的M值。

Output

按照样例的格式,输出所有人退出环的顺序。

Sample Input

 

4 6
5 4 2 3 4 2

Sample Output

4,1,2,3,6,5
 

Source

这个是通用解法,但对于本题可能会超时,还有其他算法,高人路过请指点!

 

 
#include"iostream"
#include
"cstdio"
#include
"cstdlib"

using namespace std;

typedef 
struct cnode{
        
int label;
        
int data;
        
struct cnode *next;
        }
cnode;
int m,n,i,value,j;
cnode  
*p,*q;

int main()
{
    cin
>>m>>n;
    cnode 
*clist;
    q
=(cnode *)malloc(sizeof(cnode));
    clist
=q;
    
for(i=1;i<=n;i++)
    
{
     
//cin>>value;
     cin>>value;
     p
=(cnode *)malloc(sizeof(cnode)); 
     
//p=new cnode;
    
     p
->label=i;
     p
->data=value; 
     p
->next=NULL;
     q
->next=p;
     q
=p;
     
if(i==n)q->next=clist->next;
     
    }


    p
=clist;
    
//cout<<p->label<<endl;
    for(i=1;i<=n;i++)
    
{
      
for(j=1;j<m;j++)
      
{
        p
=p->next;
      }
 
      q
=p->next;
      m
=q->data;
      
if(i==n){cout<<q->label<<endl;break;}
      cout
<<q->label<<",";
      
      p
->next=q->next;
      delete q;
    }

    
    
    
//system("pause");
    return 1;
}

 数组解法 :

Source 

 


#include
<iostream>
using namespace std;

int main()
 
{
    
int *a,*b;
    
int i,j,t,k,l,m,n;

    cin
>>m>>n;

    a
=new int[n+1]; 
    b
=new int [n+1];

    
for (i=0;i<n;i++
    
{
        cin
>>a[i];
        b[i]
=i+1;
    }


    b[n
-1]=0;
    k
=0;
    l
=n-1;
    m
=m%n;
    
if (m==0) m=n;

    
for (i=0;i<n-1;i++)
     
{
        
for (j=1;j<m;j++
        
{
                l
=k;
                k
=b[k];
        }

        cout 
<<k+1<<',';
        t
=n-i-1;
        m
=a[k]%t;
        
if (m==0) m=n-i-1;
        b[l]
=b[k];
        k
=b[k];
    }

    cout 
<< k+1<<endl;

    free(a);
    free(b);
    
//system("pause");
    return 0;
}

 
 
  • 0
    0

    查看评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
      个人资料
      • 访问:59917次
      • 积分:989
      • 等级:
      • 排名:千里之外
      • 原创:26篇
      • 转载:6篇
      • 译文:3篇
      • 评论:68条
      最新评论