Problem:
テニス

ジョウ君とヤエさんは昼休みにテニスをします。ただし、昼休みは時間が限られているので、短い時間で終わるように、得点について以下の３つのルールで行います。

相手が３点以下のときに先に５点とれば勝ち。

４対４の同点になったときは、その直後に連続して２点とった方が勝ち。

４対４の後に双方が１点ずつとったときは引き分け。

以下の図は、ジョウ君とヤエさんの試合で起こり得るすべての状況を表しています。丸の中の左の数がジョウ君の得点、右がヤエさんの得点です。Ａと書いた矢印はジョウ君が１点とったことを、Ｂと書いた矢印はヤエさんが１点とったことを表します。

ジョウ君とヤエさんの得点が与えられたとき、試合開始からその得点状況になるまでに、上の図で通り得るすべての経路を列挙するプログラムを作成してください。

入力

入力は１つのデータセットからなる。入力データは以下の形式で与えられる。

j y

j (0 ≤ j ≤ 6) がジョウ君の得点、y (0 ≤ y ≤ 6) がヤエさんの得点である。ただし、j と y がともに 0 であることはない。また、j が 6 のときは y は 4、y が 6 のときは j は 4 である。

出力

上の図で、試合開始（0-0と書かれた丸）から与えられた得点が書かれた丸までのすべての経路を出力する。経路は図の矢印に添えられた英字(A,B)の列で表し、辞書式順序（英和辞書で単語が並んでいる順番）になるように並べる。１つの経路を１行に出力する。経路の前後には空白を出力しない。

入出力例

入力例1

2 2

出力例1

AABB
ABAB
ABBA
BAAB
BABA
BBAA

入力例2

5 1

出力例2

AAAABA
AAABAA
AABAAA
ABAAAA
BAAAAA

Solution in JAVA (judge verdict: Accepted)

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        StringBuilder sb = new StringBuilder();
        if (a == 5 && b == 5) {
            String[] arr = getComb(4, 4);
            for (String s : arr) {
                sb.append(s).append("AB").append("\n");
                sb.append(s).append("BA").append("\n");
            }
        } else if (a == 6) {
            String[] arr = getComb(4, 4);
            for (String s : arr) {
                sb.append(s).append("AA").append("\n");
            }
        } else if (b == 6) {
            String[] arr = getComb(4, 4);
            for (String s : arr) {
                sb.append(s).append("BB").append("\n");
            }
        } else if (a == 5) {
            String[] arr = getComb(a - 1, b);
            for (String s : arr) {
                sb.append(s).append("A").append("\n");
            }
        } else if (b == 5) {
            String[] arr = getComb(a, b - 1);
            for (String s : arr) {
                sb.append(s).append("B").append("\n");
            }
        } else {
            String[] arr = getComb(a, b);
            for (String s : arr) {
                sb.append(s).append("\n");
            }
        }
        System.out.print(sb);
    }
    
    static String[] getComb(int a, int b) {
        if (a == 0 && b == 0) {
            return new String[]{""};
        }
        if (a == 0) {
            String[] arr = getComb(a, b - 1);
            for (int i = 0; i < arr.length; i++) {
                arr[i] = "B" + arr[i];
            }
            return arr;
        } else if (b == 0) {
            String[] arr = getComb(a - 1, b);
            for (int i = 0; i < arr.length; i++) {
                arr[i] = "A" + arr[i];
            }
            return arr;
        } else {
            String[] arr1 = getComb(a - 1, b);
            for (int i = 0; i < arr1.length; i++) {
                arr1[i] = "A" + arr1[i];
            }
            String[] arr2 = getComb(a, b - 1);
             for (int i = 0; i < arr2.length; i++) {
                arr2[i] = "B" + arr2[i];
            }
            int length = arr1.length + arr2.length;
            String[] arr = new String[length];
            for (int i = 0; i < length; i++) {
                if (i < arr1.length) {
                    arr[i] = arr1[i];
                } else {
                    arr[i] = arr2[i - arr1.length];
                }
            }
            return arr;
       }
    }
}