zoukankan      html  css  js  c++  java
  • 约瑟夫环----循环链表问题

    我们构造一个循环链表来表示排成圆圈的人。每个人的链接指向圆圈内在他左边的人。正数i表示圆圈内的第i个人。已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

    一道算法面试题如下:

    约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?

    如图:内环表示人排列的环,外环表示自杀顺序;上面N=41,M=3。

    最普通办法就是模拟整个过程:建一个bool数组,true表示此人还活着,false表示已经自杀。可以模拟整个过程

     代码(解法一):

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 using namespace std;
     5 int main()
     6 {
     7     int n;//所有的总人数
     8     int m;//间隔多少个人
     9     cin>>n;
    10     cin>>m;
    11     bool *p=new bool[n+1];//申请空间
    12     for(int i=1;i<=n;i++)
    13         *(p+i)=true;
    14     int count=0;
    15     for(int i=1,j=0;;i++)//i用来表示循环,j用来表示是不是到最后一个人
    16     {
    17         if(*(p+i))//这个人还活着
    18         {
    19             j++;
    20             if(j==m)
    21             {
    22                 *(p+i)=false;
    23                 j=0;
    24                 count++;
    25             }
    26             if(count==n)
    27             {
    28                 cout<<"最后抓到的人是:"<<i<<endl;
    29                 break;
    30             }
    31         }
    32         if(i == n)
    33             i=0;
    34     }
    35     delete []p;
    36     return 0;
    37 }
  • 相关阅读:
    O(n)回文子串(Manacher)算法
    LightOJ 1282
    LightOJ
    LightOJ
    POJ-2563
    POJ-2398
    POJ-2318
    ZOJ-3318
    [svc]ftp协议数据连接的2种模式
    [py]python中的特殊类class type和类的两面性图解
  • 原文地址:https://www.cnblogs.com/guohaoyu110/p/6357751.html
Copyright © 2011-2022 走看看