士兵隊列訓練問題 (隊列+模擬)

某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則以下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,之後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人爲止。 

Input本題有多個測試數據組,第一行爲組數N,接着爲N行新兵人數,新兵人數不超過5000。 
Output共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。 
Sample Inputjava

2
20
40

Sample Output測試

1 7 19
1 19 37

思路:循環隊列

代碼:
import java.util.ArrayDeque;
import java.util.Scanner;
public class Main{
      static void operate(int num){
            ArrayDeque<Integer> q=new ArrayDeque<>();
            for(int i=1;i<=num;i++)   q.offer(i);
            while(true){
                
                  if(q.size()<=3) break;
                  q.offer(1);
                  q.poll();
                  
                  for(int i=2;q.peek()!=1;i++){
                        if(i%2>0) {//必定是大於0,開始寫成不等於1,我想存放的是下標不能被2整除的數
                              int t=q.peek();
                              q.offer(t);
                        }
                        q.poll();
                  }
                  
                  if(q.size()<=3) break;
                  q.offer(1);
                  q.poll();
                  for(int i=2;q.peek()!=1;i++){
                        if(i%3>0) {//必定大於0,開始寫成不等於1,我想存放的是下標不能被3整除的數
                              int t=q.peek();
                              q.offer(t);
                        }
                        q.poll();
                  }
            }
            while(!q.isEmpty()){
                  System.out.print(q.poll());
                  if(q.size()!=0) System.out.print(" ");//注意是不等於0,而不是1
            }
            System.out.println();
      }
      public static void main(String[] args) {
           Scanner scan=new Scanner(System.in);
           while(scan.hasNext()){
                  int n=scan.nextInt();
                  while(n-->0){
                        int num=scan.nextInt();
                        operate(num);
                  }
           }       
    }
}
相關文章
相關標籤/搜索