海盗船问题

问题描述:ps:原题不是去这样的,差不多是下面这样的

茫茫大海,生活着一群海盗,海盗们整日饮酒作乐悠哉游哉,海盗老大渐渐厌倦,提出要去出海寻找传说中的

one piece,海盗们一致同意出海寻宝,他们有黑珍珠号,世界上最快的船,可没想到他们来到了黑椒深林(礁石像树木),船破了30个海盗们惊慌了,这时船长

杰克 .斯派罗提出30个海盗从一开始数一直到数到七或者七的倍数就得跳船去寻找食物,当然跳下去的就会go die ,结果船长按照自己的想法,顺利地活下来,请问他是第几号海盗?

分析:相当于30个人坐成一圈,从一开始数,数到七就go die;

       每次都会有人die,然后接着数,一直到最后一个最后一个肯定会活下来;

代码测试

import java.util.Scanner;
public class HaiDaoCircle {
    
    HaiDaoCircle(){
        
    }
    //黑珍珠成员方法,参数传递总人数t,参数f传递数到的危险数值
    public static void BlackPearl(int t,int f )
    {
           int mark[] =new int[t];  //0表示alive,1表示dead
         int i =0;
         int count = 0;
           int ponit = f;       //记录数到f
           int killer = 0;          //统计出列人数
              
              while(killer < t)//循环总条件死亡者小于总人数
              {
                  if(mark[i] == 0)//0表示可以继续活着
                  {
                      count++;
                      if(count == ponit)         
                      {
                      System.out.    printf("%8d(out)\n",i+1);     //数到m的那个人出列,被推下船
                          mark[i] = 1;                 //标志位置1 并记住这个位置
                          killer++;                      //出列人数加1
                          count = 0;                  //计数清零重新开始报数
                      }
                      else
                      {
                          System.out.printf("%8d",i+1);//继续往下数
                      }
                  }
                  i++;
                  if(i == t)       //人数继续下一循环
                  {
                      i = 0;
                  }
              }
        }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         System.out.println("请输入被困在船上的海盗人数N");
         Scanner sc=new Scanner(System.in);
         int N=sc.nextInt();
      // 提示输入要出圈的数值
            System.out.println("请输入要跳下船去的数值M:");
            int M = sc.nextInt();
            System.out.println("按跳下的次序结果船只会剩一个人:");
        HaiDaoCircle p1=new HaiDaoCircle();
         p1.BlackPearl(N, M);
    System.out.println("最后一个被输出的就是幸存者编号");
    }
    
}
效果

请输入被困在船上的海盗人数N30

30
请输入要跳下船去的数值M:7

7
按跳下的次序结果船只会剩一个人:
       1       2       3       4       5       6       7(out)
       8       9      10      11      12      13      14(out)
      15      16      17      18      19      20      21(out)
      22      23      24      25      26      27      28(out)
      29      30       1       2       3       4       5(out)
       6       8       9      10      11      12      13(out)
      15      16      17      18      19      20      22(out)
      23      24      25      26      27      29      30(out)
       1       2       3       4       6       8       9(out)
      10      11      12      15      16      17      18(out)
      19      20      23      24      25      26      27(out)
      29       1       2       3       4       6       8(out)
      10      11      12      15      16      17      19(out)
      20      23      24      25      26      29       1(out)
       2       3       4       6      10      11      12(out)
      15      16      17      20      23      24      25(out)
      26      29       2       3       4       6      10(out)
      11      15      16      17      20      23      24(out)
      26      29       2       3       4       6      11(out)
      15      16      17      20      23      26      29(out)
       2       3       4       6      15      16      17(out)
      20      23      26       2       3       4       6(out)
      15      16      20      23      26       2       3(out)
       4      15      16      20      23      26       2(out)
       4      15      16      20      23      26       4(out)
      15      16      20      23      26      15      16(out)
      20      23      26      15      20      23      26(out)
      15      20      23      15      20      23      15(out)
      20      23      20      23      20      23      20(out)
      23      23      23      23      23      23      23(out)
最后一个被输出的就是幸存者编号

代码测试二:大佬写得

public class YueSFu {
    static class  YueSeFu
    {
        public static int circleRun(int person , int num)
    {
    int array[] = new int[person];
    int flag = 0;
            int person_flag=0;


    //-----------------初始化数组--------------------
            for (int i = 0; i < person ; i++ )
            {
    array[i] = i+1;
            }
    //----------------执行约瑟夫环规则---------------------
    while(person>1)
    {
    for (int i = 1; i <= num ; i++, flag++ )
    {
    if (flag == array.length)
    {
                       flag = 0;
    }
    while(array[flag]==0)
    {
    flag++;
                        if (flag == array.length)
        {
                           flag = 0;
        }
    }
    if (i==num )
    {
    array[flag] = 0;
    person--;
    }
    }
    }
    //----------------遍历数组,不为零则返回--------------------
            for (int i = 0; i<array.length ; i++ )
            {
    if (array[i]!=0 )
    {
                    person_flag = array[i];
    }
            }

    return person_flag;

    }

    public static void main(String[] args) {
    
    System.out.println("最后一个人的编号为:"+ circleRun(30,7));
    
    

    }
    }
}
效果:

最后一个人的编号为:23

猜你喜欢

转载自www.cnblogs.com/nulinulizainuli/p/10532800.html