zoukankan      html  css  js  c++  java
  • circle踢人(约瑟夫环) c++

    这里更新指针法,真的每句都是坑

    (寥寥数十句,句句都是坑)

     1 //
     2 // Created by snnnow on 2020/4/12.
     3 //question:转圈,一共N个人,数到M的出列,求最后一个人的编号
     4 //这个题学到了一种新的方法,用指针(用数组实现)
     5 //初始条件每一个数组存放的数是他的下一位数,如a[3]=4;那么a[a[j]]就是下一位的下一位
     6 //去掉人以后,只需要把这个人的上一个指向它的指针换成这个人所指向的指针(也就是说,没人指向它,它就没有了)
     7 
     8 //注意一个问题:不要把初始的n改变掉(你应改另设一个初始值为N的数,作为计数器)
     9 
    10 #include <iostream>
    11 using  namespace std;
    12 int main(){
    13     int n,m;
    14     cin >> n >> m;
    15     int j = n;
    16     int k = 1;
    17     int p = 0;
    18     int ans[10010];
    19     for (int i = 1; i < n; ++i) {//注意是从一开始的
    20         ans[i] = i + 1;//赋值到下一位
    21 
    22     }
    23     ans[n] = 1;//注意第一个
    24 
    25     while(p < n){
    26         while(k < m){//这个地方要注意,这里只循环了n-1次,循环的最后一次在下面
    27             j = ans[j];//指针在移动啊~就相当于j在一直加
    28             k++;
    29         }
    30         cout<<ans[j]<<" ";//这里相当于循环的最后一次(ans[j]可以看做j的下一位啊)
    31         p++;
    32         ans[j] = ans[ans[j]];
    33         k = 1;
    34     }
    35     //小白菜曾尝试改代码,但是这样做是不对的
    36     //因为不要忘了ans[j-1]...说不定j-1=0就凉了
    37 //    while(p < n){
    38 //        while(k <= m){
    39 //            j = ans[j];
    40 //            k++;
    41 //        }
    42 //        cout<<j<<" ";
    43 //        p++;
    44 //        ans[j-1] = ans[j];
    45 //        k = 1;
    46 //    }
    47 
    48 }
  • 相关阅读:
    简单C#、asp.net mvc验证码的实现
    c# 局域网文件传输实例
    c# http get请求与post请求实例
    轻松3步实现c#windowsform窗体美化
    c#内部类的使用
    java
    java
    java
    java
    java
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12689537.html
Copyright © 2011-2022 走看看