问题描述:
有n个人,编号为1~n,按顺序围成一圈,从第一个人开始报数,到第m个人出列,再由下一个人重新从1开始报数,数到m再出列,直到所有人都出列,依次输出所有出列的人的编号。
输入:两个整数n,m,1<=m,n<=100
输出:n个整数,按顺序输出编号
动态链表
点击查看代码
#include <bits/stdc++.h>
struct node{
int data;
node* next;
};
int main(){
int n,m; scanf("%d %d", &n, &m);
node* head, *now, *p, *prev;
head = new node; head->data=1; head->next=NULL;
now = head;
for(int i=2;i<=n;i++){
p = new node; p->data=i; p->next=NULL;
now->next = p;
now = p;
}
now->next = head;
now = head;
while((n--)>1){
for(int i=1;i<m;i++){
prev = now;
now = now->next;
}
printf("%d ", now->data);
prev->next = now->next;
delete now;
now = prev->next;
}
printf("%d", now->data);
delete now;
return 0;
}
静态链表
用结构体实现单向静态链表
点击查看代码
#define N 100
#include <bits/stdc++.h>
struct node{
int id, nextid;
}nodes[N];
int main(){
int n,m; scanf("%d %d", &n,&m);
for(int i=1;i<=n;i++){
nodes[i].id=i;
nodes[i].nextid=i+1;
}
nodes[n].nextid = 1;
int now = 1, prev=1;
while((n--)>1){
for(int i=1;i<m;i++){
prev=now;
now=nodes[now].nextid;
}
printf("%d ", nodes[now].id);
nodes[prev].nextid = nodes[now].nextid;
now=nodes[prev].nextid;
}
printf("%d", nodes[now].id);
return 0;
}
用结构体实现双向静态链表
点击查看代码
#define N 100
#include <bits/stdc++.h>
struct node{
int id;
int previd, nextid;
}nodes[N];
int main(){
int n,m; scanf("%d %d", &n,&m);
for(int i=1;i<=n;i++){
nodes[i].id=i;
nodes[i].previd=i-1;
nodes[i].nextid=i+1;
}
nodes[n].nextid = 1;
nodes[1].previd = n;
int now = 1;
while((n--)>1){
for(int i=1;i<m;i++){
now = nodes[now].nextid;
}
printf("%d ", nodes[now].id);
nodes[nodes[now].previd]=nodes[now].nextid;
nodes[nodes[now].nextid]=nodes[now].previd;
now = nodes[now].nextid;
}
printf("%d", nodes[now].id);
return 0;
}
用一维数组实现静态链表
点击查看代码
#include <bits/stdc++.h>
int nodes[101];
int main(){
for(int i=1;i<=n-1;i++){
nodes[i]=i+1;
}
nodes[n]=1;
int now=1, prev=1;
while((n--)>1){
for(int i=1;i<m;i++){
prev=now;
now = nodes[now];
}
printf("%d ", now);
nodes[prev] = nodes[now];
now = nodes[prev];
}
printf("%d", now);
return 0;
}
STL list
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m; cin>>n>>m;
list<int> node;
for(int i=1;i<=n;i++){node.emplace_back(i);}
list<int>::iterator it = node.begin();
while(node.size()>1){
for(int i=1;i<m;i++){
it++;
if(it==node.end()){ it = node.begin(); }
}
cout<<*it<<" ";
list<int>::iterator next = ++it;
if(next==node.end()) next=node.begin();
node.erase(--it);
it = next;
/*
erase后,当前的iter会失效,要么新建一个iterator来保存下一个iter如上面
要么在erase时保留当前iter的自增值
it++的情况下,it本身已经指向下一个有效的iter
node.erase(it++);
if(it==node.end()) it=node.begin();
*/
}
cout<<*it;
return 0;
}