• 约瑟夫问题


    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述
    约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

    输入
    每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

    0 0

    输出
    对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
    样例输入
    6 2
    12 4
    8 3
    0 0
    样例输出
    5
    1
    7
      既然这题的归类是链表与指针,那首先就是用链表模拟啦,注意特殊情况如 N=1,M=1 
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<cstring>
     7 using namespace std;
     8 int next[3000];
     9 int last[3000];
    10 bool vis[3000];
    11 int N,M;
    12 int now;
    13 int num;
    14 int cnt;
    15 bool jud;
    16 int main(){
    17     for(;;){
    18         memset(next,0,sizeof(next));
    19         memset(last,0,sizeof(last));
    20         memset(vis,false,sizeof(vis));
    21         scanf("%d%d",&N,&M);
    22         if(N==1){
    23             cout<<1<<endl;
    24             continue;
    25         }
    26         if(N==M&&M==0){
    27             return 0;
    28         }
    29         for(int i=1;i<=N;i++){
    30             if(i!=N) next[i]=i+1,last[i+1]=i;
    31             else next[N]=1,last[1]=N;
    32         }
    33         now=num=1; jud=false;
    34         cnt=N;
    35         for(;;){
    36             if(now==N+1) now=1;
    37             if(num==M&&vis[now]==false){
    38                 num=1;
    39                 next[last[now]]=next[now];
    40                 last[next[now]]=last[now];
    41                 vis[now]=true;
    42                 cnt--;
    43                 if(cnt==1){
    44                     for(int i=1;i<=N;i++){
    45                         if(vis[i]==false){
    46                             cout<<i<<endl;
    47                             jud=true;
    48                             break;
    49                         }
    50                     }
    51                 }
    52                 if(jud==true) break;
    53                 now++;
    54             }
    55             else if(vis[now]==true) now++;
    56             else if(vis[now]==false) now++,num++;
    57         }
    58     }
    59     return 0;
    60 } 

      还可以:

     1 #include<iostream>
     2 using namespace std;
     3 int a[301];
     4 int main(){
     5     int n,m;
     6     while(1){
     7          cin>>n>>m;
     8          if(m==0&&n==0) return 0;
     9          a[1]=0;
    10          for(int i=2;i<=n;i++){
    11              a[i]=(a[i-1]+m)%i;
    12          }
    13          cout<<a[n]+1<<endl;
    14      }
    15 }
     
  • 相关阅读:
    下拉列表
    集合(List、Set、Map)
    IDEA实用教程(一)
    IDEA实用教程(四)—— 创建JavaSE工程
    IDEA实用教程(二)
    IDEA实用教程(三)
    IDEA实用教程(五)——配置IDEA的JVM内存值
    详解 JAVA 适配模式和 接口适配器
    ubuntu查看硬件信息
    IT职场人生:员工的公司观
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4905972.html
Copyright © 2020-2023  润新知