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

原创 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

 


Sample Output



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

 
 

【C语言】约瑟夫环(用单向循环链表解决)

约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围...
  • pointer_y
  • pointer_y
  • 2016年06月05日 19:42
  • 4131

用单向循环链表解决约瑟夫环(Joseph)问题

约瑟夫环(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数...
  • qq_23233049
  • qq_23233049
  • 2015年04月09日 15:29
  • 3482

约瑟夫环问题(循环链表)

华为上机题,约瑟夫环,循环链表
  • wenhai_zh
  • wenhai_zh
  • 2013年07月29日 19:02
  • 18049

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

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

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

(1)单链表解法: typedef struct node{ //定义单链表结构,next指向下一个节点 int key; node *next; }node,*pnode; ...
  • sinat_28626091
  • sinat_28626091
  • 2015年07月24日 21:12
  • 405

SDUTOJ 1197 约瑟夫问题——循环链表解法数学解法和循环队列

题目描述 n个人想玩残酷的死亡游戏,游戏规则如下: n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。 请输出最后一个人...
  • u013014691
  • u013014691
  • 2014年03月29日 00:52
  • 743

用循环链表解约瑟夫问题

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

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

  • 2012年11月19日 16:43
  • 7KB
  • 下载

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

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

约瑟夫环(N个人围桌,C语言,数据结构) 链表解法

数组解法已经放在另一篇同名文章里,注释写的也很清楚,对于不懂的或者里面有不妥的地方可以留言交流,这里放链表的解法,链表由于其数据的特性,只需要将链表表示成环形链表,数据域存储生死状态,这样只需要将处于...
  • xuyuu
  • xuyuu
  • 2017年11月04日 20:50
  • 46
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环问题单循环链表解法
举报原因:
原因补充:

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