约瑟夫环----循环链表问题
Posted 女王公园的八神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫环----循环链表问题相关的知识,希望对你有一定的参考价值。
我们构造一个循环链表来表示排成圆圈的人。每个人的链接指向圆圈内在他左边的人。正数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 }
以上是关于约瑟夫环----循环链表问题的主要内容,如果未能解决你的问题,请参考以下文章