洛谷每日1题-------Day42__P1996 约瑟夫问题

题目描述

n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。

输入格式

输入两个整数 n,m。

输出格式

输出一行 n 个整数,按顺序输出每个出圈人的编号。

输入输出样例

输入 #1复制

10 3

输出 #1复制

3 6 9 2 7 1 8 5 10 4

说明/提示

1≤m,n≤100

题解:

#include
using namespace std;
class Link{
public:
   int data;
   Link* next;
};
int main(){
    int n,m,temp=1;cin>>n>>m;
    Link* L=new Link;
    Link* p=L;
    L->next=nullptr;
    for(int i=1;i<=n;i++){
        p->next=new Link;
        p=p->next;
        p->data=i;
    }
    p->next=L->next;//首尾相连
    p=L->next;//指向首元结点
      // 用于跟踪前一个节点
    Link* prev = p;
    while (prev->next != p) {
        prev = prev->next;
    }
    while(n>0){
        if(temp!=m){
            prev = p;
            p = p->next;
            temp++;
        }
        else{
            cout << p->data << " ";
            prev->next = p->next;  
            Link* q = p;
            p = p->next;
            delete q;
            temp = 1;
            n--;
      }
   }
     return 0;
}

你可能感兴趣的:(洛谷每日1题,算法,数据结构,c++,学习,笔记)