zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    问题:n个人围成一个环,从第i个开始,由1至interval不断报数,凡报到interval的出列,直到环空为止。

    #include <iostream>
    #include <string>
    using namespace std;
    //结构体
    struct jonsephus
    {
        int code;//数字
        jonsephus *next;//next指针
    };
    void jonsInt(jonsephus *&head,int n)
    {
        jonsephus *g;//g为跟踪指针
        g = head = new jonsephus;//新结点
        for (int j = 1; j <= n; j++)
        {
            g->code = j;
            if (j == n) g->next = head;//最后一个结点的next指针指向头指针 形成环状
            else g->next = new jonsephus;//新结点插入链表
            g = g->next;//跟踪指针指向新结点
        }
    }
    void showJ(jonsephus *head)
    {
        cout << "Now include:" << endl;
        jonsephus *pp = head;//跟踪指针pp
        do
        {
            cout << pp->code << '	';
            pp = pp->next;//移动跟踪指针位置
        }
        while (head != pp);//遍历 当head指针等于pp 表示指针移到了头指针位置
        cout << endl;
    }
    void standUp(jonsephus *&head,int n,int i,int interval)
    {
        jonsephus *q = NULL,*p = NULL;//定义两个跟踪指针
        int c;//当前计数
        jonsInt(head, n);
        showJ(head);//检查初始化是否成功
        p = q = head;//先设定pq均为头指针
        while (p->next != head)//遍历得到指向头指针的指针作为p
        {
            p = p->next;
        }
        for (c = 1;c < i; c++)//循环移位等到从第i位开始数数
        {
            p = p->next;
            q = p->next;
        }
        while (p != q)//若果p指针的next指向它自身 表明剩下最后一个对象
        {
            for ( c = 1; c < interval; c++)//每次循环interval-1次挪动指针即可,再下面代码会挪动一次指针
            {
                p = p->next;
                q = p->next;
            }
            cout << q->code << " is stand up!" << endl;//输出的是q指针的值 下面要释放q指针指向的内存空间
            p->next = q->next;//p指针的next指针指向q指针的next指针 这三句代码相当于挪动了一次指针
            delete q;//释放q指针指向的内存空间
            q = p->next;//q指针指向p的next指针
        }
        cout << q->code << " is stand up!" << endl;//输出最后一个
    }
    void main()
    {
        int n, i, interval;
        cout << "How many persons?" << endl;
        cin >> n;//输入多少人
        cout << "Start with which person?" << endl;
        cin >> i;//输入哪个人开始报数
        cout << "Which number will stand up?" << endl;
        cin >> interval;//输入数到第几则出列
        jonsephus *head = NULL;//定义头指针
        standUp(head, n, i, interval);//调用函数
        getchar();
        getchar();
    }
  • 相关阅读:
    单独下载克隆clone github中master 分支的文件夹
    caffe makefile.config anaconda2 python3 所有问题一种解决方式
    问题解决
    找不到cannot find -lpython3.5m caffe anaconda python3 ubuntu16.04
    bash./ autogen 没有这个文件 ubuntu16.04git安装glog报错
    cumulative match score
    【Python网络编程】复习
    【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
    【Python网络编程】UDP聊天、TCP文件下载、多线程UDP聊天器、多进程拷贝文件
    【前端性能】网站性能优化
  • 原文地址:https://www.cnblogs.com/godehi/p/8317805.html
Copyright © 2011-2022 走看看