Ошибка выполнения на ACM-ICPC Live Archive 3242 - Криптекс Да Винчи

1

Я представил множество решений, написанных на Java для этой проблемы в архиве ACM-ICPC Live. Я последовал строго за инструкциями по написанию Java-решений. Я даже установил JDK 6 в свою IDE, но всегда получаю Runtime error, любая идея, что бросает исключение здесь, потому что я думаю, что обрабатывал все исключения.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

class Main {

    BufferedReader read;
    BufferedWriter write;
    Integer D, N;
    String U, S;
    ArrayList<String> cryptex;

    public static void main(String[] args) {

        new Main().solve();

    }

    private void solve() {

        read = new BufferedReader(new InputStreamReader(System.in));
        write = new BufferedWriter(new OutputStreamWriter(System.out));

        process();

        try {
            read.close();
            write.flush();
            write.close();
        } catch (IOException ex) {
            return;
        }
    }

    private void process() {

        try {
            D = Integer.parseInt(read.readLine().trim());
        } catch (IOException ex) {
            return;
        }

        for (int i = 0; i < D; i++) {
            try {
                String[] params = read.readLine().trim().split("\\s+");
                if (params.length != 3) {
                    return;
                }

                N = Integer.parseInt(params[0]);
                U = params[1];
                S = params[2];

                cryptex = new ArrayList<String>(N);

                for (int j = 0; j < N; j++) {
                    cryptex.add(read.readLine().trim());
                }

                try {
                    write.write(U + " " + solveCase());
                } catch (Exception ex) {
                    return;
                }

                write.newLine();
                read.readLine();
            } catch (IOException ex) {
                return;
            }

        }
    }

    private String solveCase() throws Exception {
        Integer n = null, f = null, add = null;
        for (int i = 0; i < N; i++) {
            if (S.charAt(i) != '_') {
                n = cryptex.get(i).indexOf(S.charAt(i));
                f = cryptex.get(i).indexOf(U.charAt(i));
                add = n - f;
                break;
            }
        }
        if (n == null || f == null || add == null) {
            throw new Exception("Incorrect test case exception.");
        }
        char[] ret = S.toCharArray();
        for (int i = 0; i < N; i++) {
            f = cryptex.get(i).indexOf(U.charAt(i));
            n = (add + f + 26) % 26;
            ret[i] = cryptex.get(i).charAt(n);
        }

        return new String(ret);
    }

}

Любая идея о том, что я могу делать неправильно?

Теги:

1 ответ

0

В вашем методе process вы вызываете

D = Integer.parseInt(read.readLine().trim());

Это не оптимально. Используйте сканер. Ваша строка должна выглядеть примерно так:

Scanner sc = new Scanner(System.in);
//...
try {
    D = sc.nextInt(); // Number of test cases
    N = sc.nextInt(); // Rings
    U = sc.next();    // Unlocking word
}
//...

Кроме того, обратите внимание, что, вероятно, будет более одного тестового примера, поэтому process() или какой-либо другой метод должен быть внутри цикла for.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню