Входные данные - строки с цифрами, образующие прямоугольную матрицу, ввод заканчивается по слову "end" (без ковычек). Получить матрицу того же размера, каждый элемент которой равен сумме соседних элементов начальной матрицы (( i,j) = (i-1, j) + (i+1, j) + (i, j-1) + (i, j+1))
; граничные элементы имеют соседей на противоположной стороне матрицы; в случае с одним рядом или одним столбцом элемент может быть сам себе соседом.
Пример:
input 1:
9 5 3
0 7 -1
-5 2 9
end
output 1:
3 21 22
10 6 19
20 16 -1
input 2:
1
end
output 2:
4
Я смог написать следующее:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList < int[] > arr = new ArrayList < > ();
while (true) {
String input = in .nextLine();
if (input.equals("end")) {
break;
} else {
String[] item = input.split(" ");
int[] itemInteger = new int[item.length];
for (int i = 0; i < item.length; i++) {
itemInteger[i] = Integer.parseInt(item[i]);
}
arr.add(itemInteger);
}
}
int row = arr.size();
int col = arr.get(0).length;
int[][] result = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i - 1 < 0) {
i = row;
} else if (i + 1 >= row) {
i = -1;
} else if (j - 1 < 0) {
j = col;
} else if (j + 1 >= col) {
j = -1;
}
result[i][j] = arr.get(i - 1)[j] + arr.get(i + 1)[j] + arr.get(i)[j - 1] + arr.get(i)[j + 1];
}
}
for (int[] tmp: result) {
for (int x: tmp) {
System.out.print(x + " ");
}
System.out.println();
}
}
И вылетаю за пределы массива т.к. значение i = row
при i-1 < 0
вставляется в arr.get(i)[j-1]
и т.п.. Исключения в курсе еще не проходились, код написан исходя из моих знаний, возможно я перемудрил и не вижу какого-то простого решения...
Проблема в том что i и j часто переопределяются и в строке c result они могут быть переопределены несколько раз. Например i = -1; result[i][j], result[-1][j] получается. Я для решения ввел еще 4 переменных. Вот пример.
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
int a = i;
int b = i;
int c = j;
int d = j;
if (i - 1 < 0) {
a = row;
}
if (i + 1 >= row) {
b = -1;
}
if (j - 1 < 0) {
c = col;
}
if (j + 1 >= col) {
d = -1;
}
result[i][j] = arr.get(a - 1)[j] + arr.get(b + 1)[j] + arr.get(i)[c - 1] + arr.get(i)[d + 1];
}
}
Также можно использовать (i + 1) % row и (j + 1) % col, но это не работает для (i - 1) и (j - 1).
Можно воспользоваться взятием остатка:
((i-1+row)%row; j) - верхний,
((i+1)%row; j) - нижний,
(i; (j-1+col)%col) - левый,
(i; (j+1)%col) - правый.
Суммируете их и получите то что нужно для (i; j)
result[i][j] = arr.get((i - 1 + row) % row)[j] + arr.get((i + 1) % row)[j] + arr.get(i)[(j - 1 + col) % col] + arr.get(i)[(j + 1) % col];
PS А if-ы убрать
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Я впервые использую rxjava и прочитав о subscribeOn(SchedulersnewThread()) и observeOn(Schedulers
Делаю приложение на androidВозникла проблема с корректным отображением анимации для 12ти кнопок
Задался вот этим вопросом(там тоже самое ввиде ответа удалю)