5. Matrix Shuffling
Условие:
https://softuni.bg/trainings/resources/officedocument/59902/exercise-java-advanced-may-2021/3345
Дава ми 20/100, като 2та примерни теста са ми верни. Направих няколко дебъга и програмата ми работи както трябва. Бих бил благодарен ако ми откриете проблема. Ето го кода:
package JavaAdvanced; import java.util.Scanner; public class MatrixShuffling { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int N = scan.nextInt(); int M = scan.nextInt(); String[][] arr = new String[N][M]; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { arr[i][j] = scan.next(); } } String[] line; int a; int b; int x; int y; while (true) { line = scan.nextLine().split(" "); if (line[0].equals("END")) { break; } if (line.length == 5) { if (line[0].equals("swap")) { a = Integer.parseInt(line[1]); b = Integer.parseInt(line[2]); x = Integer.parseInt(line[3]); y = Integer.parseInt(line[4]); if (a >= N || b >= M || x >= N || y >= M) { System.out.println("Invalid input!"); } else { String c = arr[a][b]; arr[a][b] = arr[x][y]; arr[x][y] = c; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } } } else if (!line[0].equals("")) { System.out.println("Invalid input!"); } } } }
Ползвам scan.next() при такива случаи с матрици - тъй като не ми се занимава да правя със сплит функцията.
Ако разбирате Java, бихте ли обяснили защо точно не става със scan.next() и как работи scan.next()? И ако може да обясните BufferedReader, защото него не съм го ползвал никъде?
Здравей,
С next и nextInt прочиташ следващ стринг или int(общо казано токен) разделени от whitespace.
Така четеш по един токен от конзолата независимо дали е на същия или на следващия ред. Когато прочетеш един път поставя мислено cursor-а на 1 с един char напред след края на прочетения токен.
Когато използваш next(), но няма елемент от текущия ред, който да вземе автоматично ще се опита да прочете такъв от следващия ред.
Тоест ако пуснеш програмата и въведеш:
2
1 2 3
4 5 6
Когато се опита да прочете втория токен:
int N = scan.nextInt(); int M = scan.nextInt();
Ще го прочете от първия токен от втория ред(1) и ще ти направи матрицата [2][1];
По този начин при попълване на числа в матрицата, ако на някой от редовете имаш по-малко елементи ще попълва с едно число напред матрицата, което ще изглежда така:
инпут:
2 3
1 2 3
4 5
swap 1 1 1 1
swap 1 1 1 1
END
output:
1 2 3
4 5 swap
Затова аз лично не бих използвал тези методи, ако не слагам лично данните в конзолата.
Относно BufferedReader за проблема с Time limit:
Много Ви благодаря!