约瑟夫问题
约瑟夫问题
约瑟夫问题:P1996 约瑟夫问题 洛谷
n 个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从 1 开始报数,数到 m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
思路通过结构体存储每一个编号,并存储 pre, nxt,循环处理报到 m就将(输出该编号)对应编号的 pre, nxt处理,使下一次循环是可以跳过该编号;
代码实现:
#include<bits/stdc++.h>
using namespace std;
int n, m;
struct node{
int id, nxt, pre;
}a[110];
int main(){
cin >> n >> m;
if(n == 0 || m == 0) return 0;
for(int i = 1; i <= n; i ++){
a[i].id = i;
a[i].nxt = i + 1;
a[i].pre = i - 1;
}
a[1].pre = n;
a[n].nxt = 1;
int k = 1, num = 1;
while(a[k].id != a[k].nxt){
if(num == m){
cout << k << " ";
int pre = a[k].pre;
a[pre].nxt = a[k].nxt;
int nxt = a[k].nxt;
a[nxt].pre = a[k].pre;
num = 0;
}
k = a[k].nxt;
num ++;
}
cout << k << endl;
return 0;
}