質問: bi-1 かつ ai > bi が成り立つとき (a1, a2, ..., as) が (b1 , b2, ..., bt) より先に出力されるように並べることである. 入力データ は 1 行からなり,1 行目に n が書かれている. 出力には並べ方を辞書式順序で 1 行に1通りずつ書き最後に改行を入れること. 並べ方は (a1, a2, ..., as) の出力は整数 a1, a2, . . . , as をこの順番に空白で区切って出力すること. ``` 入力例1 5 出力例1 5 4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 ``` 入力 入力は複数のデータセットからなる.n が 0 のとき入力が終了する.データセットの数は 5 を超えない. 出力 データセットごとに、辞書式順序で全て出力する. ``` 入力例 5 5 0 出力例 5 4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 5 4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 ``` 参照:AIZU ONLINE JUDGE
回答: このように書くと分かりやすいですか?paiza.ioで実行させています。restは「残り」という意味で、posは「位置」です。 ``` import java.util.*; public class Main { private int a[]; // 並べ方(a1, ..., as) public Main(int size) { a = new int[size+1]; // a0はダミー。a1 ... asを使用する a[0] = size; } public void dfs(int rest, int pos) { // 残りの正方形の数が0のとき、現在の並べ方を表示する if (rest == 0) { for (int i = 1; i < pos - 1; i++) System.out.print(Integer.toString(a[i]) + " "); System.out.println(Integer.toString(a[pos - 1])); return; } // そうでなければ、正方形を現在の位置に積み上げて右の位置に移る for (int i = Math.min(rest, a[pos-1]); i >= 1; i--) { a[pos] = i; dfs(rest - i, pos + 1); } } public static void main(String[] args) throws Exception { // Your code here! (new Main(5)).dfs(5, 1); } } ```