题目链接:http://noi.openjudge.cn/ch0302/1748/
1、链表
题解:使用链表,指针next指向下一个元素,首先初始化将所有元素构成一个环,然后依次找排名为m的并且删除
#include <stdio.h>
#include <iostream>
using namespace std;
struct point {
int number;
point *next;
point(){
next=NULL;
}
};
int main(){
int n,m;
cin>>n>>m;
while(n!=0&&m!=0){
point *head=new point();
head->number=1;
head->next=NULL;
point *tmp=head;
for(int i=1;i<n;i++){//构成一个环
point *t=new point();
t->number=i+1;
tmp->next=t;
tmp=tmp->next;
}
tmp->next=head;
while(tmp->next!=tmp){//当只剩一个的时候
for(int i=1;i<m;i++){//找排名为m的前一个
tmp=tmp->next;
}
tmp->next=tmp->next->next;
}
cout<<tmp->number<<endl;
cin>>n>>m;
}
}
2、数组
题解:使用数组记录当前元素是否在排队中,
注意:计数时只记在队列中的个数,不再队列中的不应该参与计数
#include <stdio.h>
#include <iostream>
using namespace std;
int a[305];
bool b[305];
int main(){
int n,m;
cin>>n>>m;
int size=n;
for(int i=0;i<n+5;i++){
b[i]=true;
}
while(n!=0&&m!=0){
int j=1,t=0;//每轮都需要初始化
size=n;
for(int i=0;i<n+5;i++){
b[i]=true;
}
while(size>1){
while(true){//只记没有删除的元素的个数
if(j==m){
break;
}
if(b[t%n]){
j++;
t++;
}else{
t++;
}
}
j=1;
if(!b[t%n]){//当前为删除的元素时找最近的剩余的元素
while(!b[t%n]){
t++;
}
b[t%n]=false;
t++;
}
else{
b[t%n]=false;
}
size--;
t=t%n;
}
for(int i=0;i<n;i++){//找最后剩的那个
if(b[i]){
cout<<i+1<<endl;
break;
}
}
cin>>n>>m;
}
}