Java:推測数列

12387 ワード

質問する



に答える

  • 数列問題
  • nでn個の数列を用い,f(16)が現れるまで1,2,3,4,3,2,1,2,1に回転した.
  • 最初は数列だとは知らなかったのですが、どうやって解くのか、ふと数列の組み合わせを思い出して、数列の実現方法から学び、さらに解いて、やっと解けました.
  • 完全なコード

    package inflearn;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class I0808 {
      static int n, f;
      static boolean flag = false;
      static int[] arr;
      static boolean[] visited;
      static int[] output;
    
      public static void main(String[] args) {
    
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        f = sc.nextInt();
    
        arr = new int[n];
        visited = new boolean[n];
        output = new int[n];
        for (int i = 0; i < n; i++) {
          arr[i] = i + 1;
          visited[i] = false;
        }
        int depth = 0;
    
        dfs(depth, n, n);
        for (int i = 0; i < n; i++) {
          System.out.print(output[i] + " ");
        }
      }
    
      static void dfs(int depth, int n, int r) {
        if (depth == r) {
          if (isAnswer(output)) flag = true;
          return;
        }
    
        for (int i = 0; i < n; i++) {
          if (flag) return;
          if (!visited[i]) {
            visited[i] = true;
            output[depth] = arr[i];
            dfs(depth + 1, n, r);
            visited[i] = false;
          }
        }
    
      }
    
      static boolean isAnswer(int[] tmp) {
    
        int[] ch = tmp.clone();
        for (int j = ch.length - 1; j > 0; j--) {
          for (int i = 0; i < j; i++) {
            ch[i] = ch[i] + ch[i + 1];
          }
        }
        return ch[0] == f;
      }
    
    }