• josephus问题


    Description

    josephus问题其实就是一个游戏,一群小孩围成一个圈,设置一个数,这个数是个小于小孩总数大于0的一个整数,从第一个小孩开始报数,当其中一个小孩报到你设置的那个数的时候离开那个圈,这样一来反复报下去,直到只剩下最后一个小孩的时候那个小孩就是胜利者。现在的问题是设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。请以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。本题可以对多个测试案例进行测试。

    Input

    第一行输入测试案例数T 以下T行,每一行是一个测试案例,分别输入n,s,m,以一个或多个空格隔开

    Output

    每个测试案例输出2行,第一行输出出局顺序第2行输出"** win.",其中**是胜利者编号,即最后出局者

    Sample Input

    1
    9 1 5
    

    Sample Output

    5 1 7 4 3 6 9 2 8
    8 win.
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<stdlib.h>
    using namespace std;
    typedef struct link{
        int num;
        struct link *next;
    }IA;
    IA *Create();
    void *Delete(IA *head);
    int n,m,s;
    int main()
    {
        IA *head = NULL,*tail = NULL;
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d%d",&n,&s,&m);
            tail = Create();
            Delete(tail);
        }
        return 0;
    }
    IA *Create()
    {
        IA *tail ,*head = NULL,*p;
        tail = head;
        int i = 1;
        while(i<=n){
                p = (IA*)malloc(sizeof(IA));
               p->num = i;
               if(head ==NULL){
                  head  = p;
                  tail = p;
                  tail->next = NULL;
               }
               else {
                    tail->next =p;
                    p->next =NULL;
                    tail = p;
               }
               i++;
        }
        tail->next = head;
        return tail;
    }
    void *Delete(IA *tail)
    {
        IA * ptr1,*ptr2;
        int cnt = 0,hui = 0,i = 1;
        if(tail->next ==NULL) return 0;
          ptr1 = tail;
        ptr2 = tail->next;
        while(i!=s)
        {
            ptr1 = ptr2;
            ptr2 = ptr2->next;;
            i++;
        }
        while(hui!=n - 1){
            cnt++;
           if(cnt == m){
              printf("%d ",ptr2->num);
              ptr1 ->next =ptr2->next;
              free(ptr2);
              cnt = 0;
              hui++;
           }
           else ptr1 = ptr2;
           ptr2 = ptr1->next;
        }
       printf("%d
    %d win",ptr1->num,ptr1->num);
    }
    View Code

    磕磕盼盼能自己写出来了orz

  • 相关阅读:
    python随笔:邮箱题目
    05 小程序自定义组件
    04 小程序常用组件-view text rich-text icon swiger
    03 小程序语法-WXSS样式-尺寸-样式 -选择器
    02 小程序语法-数据绑定与事件绑定
    01 小程序入门与vscode开发加装插件
    JAVA25-Git、Vue.js
    JAVA14-File类、递归、字节流、字符流、缓冲流、转换流、序列化流、Files
    JAVA13-异常、线程、同步、等待与唤醒案例、线程池、Lambda表达式
    JAVA12-Scanner类、Random类、ArrayList类、String类、static、Arrays类、Math类、静态方法
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4332238.html
Copyright © 2020-2023  润新知