문제 출처: https://www.acmicpc.net/problem/2784
문제

가로줄
세로줄
6개의 단어가 주어졌을 때, 이를 가지고 가로 세로 퍼즐을 만드는 프로그램을 작성하시오. 단어 3개는 가로줄, 3개는 세로줄로 배치해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
    private static boolean[] visited; // 방문 기록
    private static List<String> word;     // 문자열 저장
    private static List<List<String>> list = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        word = new ArrayList<>(6);
        visited = new boolean[6];
        for (int i = 0; i < 6; i++) {
            word.add(reader.readLine());
        }
        permutation(new int[3], 0, 3);
        if (list.isEmpty()) sb.append(0);
        else {
            for (int i = 0; i < 3; i++) {
                sb.append(list.get(0).get(i)).append("\n");
            }
        }
        System.out.println(sb);
    }
    private static void permutation(int[] ans, int cnt, int R) {
        if (cnt == R) {
            // 3개 다 뽑은 경우
            List<String> temp = new ArrayList<>(3);
            List<String> copy = new ArrayList<>(6);
            copy.addAll(word);
            // 뽑은 3개 단어 넣기
            for (int i = 0; i < 3; i++) {
                temp.add(word.get(ans[i]));
                copy.remove(word.get(ans[i]));
            }
            // 퍼즐이 성립하는지 비교
            for (int i = 0; i < 3; i++) {
                String tempStr = "" +
                        temp.get(0).charAt(i) +
                        temp.get(1).charAt(i) +
                        temp.get(2).charAt(i);
                if (copy.contains(tempStr)) copy.remove(tempStr);
                else return;
            }
            list.add(temp);
            return;
        }
        for (int i = 0; i < 6; i++) {
            if (!visited[i]) {
                visited[i] = true;
                ans[cnt] = i;
                permutation(ans, cnt + 1, R);
                visited[i] = false;
            }
        }
    }
}