首页 > 代码库 > 约瑟夫环----循环链表问题

约瑟夫环----循环链表问题

我们构造一个循环链表来表示排成圆圈的人。每个人的链接指向圆圈内在他左边的人。正数i表示圆圈内的第i个人。已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

一道算法面试题如下:

约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?

技术分享

如图:内环表示人排列的环,外环表示自杀顺序;上面N=41,M=3。

最普通办法就是模拟整个过程:建一个bool数组,true表示此人还活着,false表示已经自杀。可以模拟整个过程

 代码(解法一):

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 int main()
 6 {
 7     int n;//所有的总人数
 8     int m;//间隔多少个人
 9     cin>>n;
10     cin>>m;
11     bool *p=new bool[n+1];//申请空间
12     for(int i=1;i<=n;i++)
13         *(p+i)=true;
14     int count=0;
15     for(int i=1,j=0;;i++)//i用来表示循环,j用来表示是不是到最后一个人
16     {
17         if(*(p+i))//这个人还活着
18         {
19             j++;
20             if(j==m)
21             {
22                 *(p+i)=false;
23                 j=0;
24                 count++;
25             }
26             if(count==n)
27             {
28                 cout<<"最后抓到的人是:"<<i<<endl;
29                 break;
30             }
31         }
32         if(i == n)
33             i=0;
34     }
35     delete []p;
36     return 0;
37 }

 

 

 

 

约瑟夫环----循环链表问题