zoukankan      html  css  js  c++  java
  • poj3750-小孩报数问题(约瑟夫环)

    一,题意:
      中文题。
    二,思路:
      1,输入。
      2,无限循环1~n~1~n,直到输出n次,再跳出。
      3,输出名字,并标记。

    普通模拟版:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int main() {
     5     char name[56][16];
     6     int n, w, s;
     7     cin >> n;
     8     for (int i = 1; i <= n; i++) {
     9         cin >> name[i];
    10     }
    11     scanf("%d,%d", &w, &s);
    12     int count = 0;                            //记录经过未标记的名字几次
    13     int k = 0;                                //记录输出的次数
    14     for (int i = w; k!=n ; i++) {            //输出 n 次,跳出
    15         if (i > n) i = i % n;                //循环 1~n~1~n
    16         if (strcmp(name[i], "1")) count++;    //经过未标记的名字时 count++
    17         if (count == s) {                    //经过s次未被标记的名字时
    18             cout << name[i] << endl;
    19             k++;                            //输出一次 k++
    20             count = 0;                        //输出以后count重新记数
    21             w = i;                            //输出之后,w 重新从 i 开始
    22             strcpy(name[i], "1");            //已经输出的名字标记为 1 
    23         }
    24     }
    25     return 0;
    26 }
    View Code

    线性表模拟版:

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 
     5 class SeqList {
     6 public:
     7     SeqList(string str[], int n);            //构造函数,创建长度为n 的线性表
     8     string Delete(int i);                    //输出并删除结点
     9     int getLength() { return length; }        //获取长度
    10 private:
    11     int length;
    12     string name[65];
    13 };
    14 
    15 SeqList::SeqList(string str[], int n) {        //实现构造函数
    16     for (int i = 0; i < n; i++) {
    17         name[i] = str[i];
    18     }
    19     length = n;
    20 }
    21 
    22 string SeqList::Delete(int i) {
    23     string x = name[i - 1];                    //定义一个x接收被删除的字符串
    24     for (int j = i; j < length; j++) {        //从被删除的结点开始,后面的向前移动,覆盖被删除的结点
    25         name[j - 1] = name[j];                        
    26     }
    27     length--;                                //删除一个结点,长度减 1
    28     return x;
    29 }
    30 
    31 int main() {
    32     string str[65];
    33     int n, w, s;
    34     cin >> n;
    35     for (int i = 0; i < n; i++) {
    36         cin >> str[i];
    37     }
    38     scanf("%d,%d", &w, &s);
    39     SeqList S(str, n);
    40     while(n--) {
    41         int ans = (w + s - 1);                 //ans 表示要输出的名字的序号
    42         if ( ans==S.getLength() ) {
    43             w = ans;
    44             cout << S.Delete(w) << endl;
    45         }
    46         else {
    47             if (ans % S.getLength() != 0) {
    48                 w = ans % S.getLength();
    49                 cout << S.Delete(w) << endl;
    50             }
    51             else {
    52                 cout << S.Delete(w--) << endl;
    53             }
    54             
    55         }
    56 
    57     }
    58     return 0;
    59 }
    View Code

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Case study, about cnblogs
    《Windows用户态程序高效排错》
    为什么java+winform就那么慢呢
    Mixed DLL Loading analysis
    <a>标签无跳转
    各情景下元素宽高的获取
    在Asp.Net中使用FCKeditor的常用配置
    Small Program 1.0 发布
    微软会向开发者收费吗?
    BO入门实战
  • 原文地址:https://www.cnblogs.com/My-Sunshine/p/4957919.html
Copyright © 2011-2022 走看看