约瑟夫环问题(队列实现)

问题描述:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。

代码:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std; 
 4 int main(){
 5     queue<int> s;
 6     int n, m;
 7     cin >> n >> m;
 8     for(int i = 1; i <= n; i ++){
 9         s.push(i);
10     }
11     int cur = 1;
12     while(s.size() > 1){        //当剩余人数大于1时继续循环 
13         int x = s.front();        //取队首 
14         s.pop();                //将队首元素弹出 
15         if(cur == m){            //如果报数到达条件,则报数将置为1 
16             cur = 1;
17         }else{
18             cur++;                //否则报数递增,然后将之前取得队首的值入队尾 
19             s.push(x);        
20         }
21     }
22     cout << s.front() << endl;    //当还有一个人的时候,打印队首 
23     return 0;
24 }

猜你喜欢

转载自www.cnblogs.com/pureayu/p/12365458.html