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

原创 2006年06月18日 22:01:00

约瑟夫环问题

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;
}

 
 
  • 相关文章推荐

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

    • 2012年06月25日 23:44
    • 2KB
    • 下载

    约瑟夫问题循环链表解法、队列解法

    (1)单链表解法: typedef struct node{ //定义单链表结构,next指向下一个节点 int key; node *next; }node,*pnode; ...

    用循环链表解约瑟夫问题

    原题:用循环链表求解约瑟夫问题,n 个人围成一个圆圈,首先从第 1 个人开始一个一个地顺时针报数,报到第 m 个人,令其出列。然后再从下一个人开始,从 1 顺时针报数,报到第 m 个人,再令其出列,....

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

    • 2012年03月21日 16:02
    • 2KB
    • 下载

    约瑟夫环的链表解法和数学解法

    约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷...

    约瑟夫环单循环链表C语言实现

    • 2009年12月12日 17:48
    • 1KB
    • 下载

    约瑟夫环实验 建立单循环链表

    • 2009年04月19日 15:16
    • 31KB
    • 下载

    单循环链表的约瑟夫问题(C++)

    在解决约瑟夫问题上,利用无表头的单循环链表是相当简单的,可以将约瑟夫问题当作链表的删去节点操作。 约瑟夫问题:已知n个人围坐在一张圆桌周围。从编号为s的人开始报数,数到m的那个人出列;又从其下一个人...

    VC++2012编程演练数据结构《2》单循环链表与约瑟夫问题

    循环链表(Circular Linked List)是一种首尾相接的链表,它与单链表的唯一区别在于对尾结点的处理;因为在单链表中尾结点的指针域NULL改为指向头结点就得到了单循环链表。单循环链表可以用...
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:约瑟夫环问题单循环链表解法
    举报原因:
    原因补充:

    (最多只允许输入30个字)