zoukankan      html  css  js  c++  java
  • 士兵队列训练问题

    Description

    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
     

    Input

    本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
     

    Output

    共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
     

    Sample Input

    2 20 40
     

    Sample Output

    1 7 19 1 19 37
     
     
     
     
    解题思想:
    使用数组与循环,判断数组报到了相应数字该下标赋值为零,然后删除数组内所有的零,再继续循环直到人数为三跳出循环。
     
     
    代码如下:
     

    #include "stdio.h"
    int main()
    {
     int a[5000],i,j=0,n=0,m,x,z=0,ci;

     scanf("%d",&ci);
     while(ci--)
            { scanf("%d",&m);
                for(i=0;i<m;i++)
      a[i]=i+1;

     while (m>3)
     {

      for(i=0;i<m;i++)
      {
       n++;
       if(n==2)
       {  a[i]=0;  n=0; }

      }

      for(i=0;i<m-z;i++)
      {  if(a[i]!=0) j++;
      else
      {
       for(x=j;x<m;x++)
        a[x]=a[x+1];
       z++;j++;
      }
      }
      m=m-z;n=0;j=0;z=0;

      if(m<=3) break;
      for(i=0;i<m;i++)
      {
       n++;
       if(n==3)
       {  a[i]=0;n=0; }

      }


      for(i=0;i<m-z;i++)
      {
       if(a[i]!=0) j++;
       else
       {  for(x=j;x<m;x++)
       a[x]=a[x+1];
       z++; j++;
       }
      }
            m=m-z;n=0;j=0;z=0;
     }
     for(i=0;i<m;i++)
      {printf("%d",a[i]);
      if(i<m-1) printf(" ");}
      printf(" ");}

     return 0;

    }

     
     
  • 相关阅读:
    关于Java 拷贝数组方法 Arrays.copyOf() 是地址传递还是值传递
    n皇后问题
    子集
    排列
    矩阵翻转
    删除集合元素的方法
    Java最大值与最小值
    Spring Security +Oauth2 +Spring boot 动态定义权限
    VirtualBox Centos7虚拟机集群配置
    VirtualBox使用Centos7与主机共享文件夹
  • 原文地址:https://www.cnblogs.com/llfj/p/5679148.html
Copyright © 2011-2022 走看看