Java

Java | Помогите, пожалуйста с задачей.

Дан план замка в виде матрицы:
1 0 1 0 1
1 1 1 0 1
1 0 1 1 1
1 0 0 1 1
("1", если есть стена, а "0", если нет стены).
Вывести количество непрерывных вертикальных и горизонтальных стен.
То есть, тут 5 вертикальных стен и 9 горизонтальных стен.
Maxim Sumenkov
Maxim Sumenkov
265
Пусть размеры замка - n строк * m столбцов.
1) Создайте две целочисленные переменные, инициализируйте их нулями, пусть будут v и g. Каждая переменная - количество стен таких и сяких.
2) Заведите две логические переменные и инициализируйте их значением false, назовём их b0 и b1. Они будет true, если вы "идёте вдоль определённой стены", об этом позже.
3) Ходите в цикле по строкам от нулевой до n-2 строки включительно. Внутри этого цикла:
{
Если b0 или b1, то увеличьте g на 1 и приравняйте b0 и b1 к false.
Вложите другой цикл по столбцам от нулевого до m-1 включительно. Внутри второго цикла:
{
Если текущий элемент равен 1 и элемент на следующей строке и в том же столбце равен 0, то b0 приравняйте к true и (если b1, то приравняйте b1 к false и увеличьте g на 1).
Если текущий элемент равен 0 и элемент на следующей строке и в том же столбце равен 1, то b1 приравняйте к true и (если b0, то приравняйте b0 к false и увеличьте g на 1).
Если текущий элемент равен элементу на следующей строке и в том же столбце, то
{
если (b0 или b1),то увеличьте g на 1.
b0 и b1 приравняйте к false.
}
}
}
4) Повторите пункт 3), поменяв в нём местами
g и v
n и m
строки и столбцы
5) Выведите результат, содержащийся в g и v.
Всё.
Что бы реализовать это на Java нужно знать про цикл for, if, многомерные массивы, числовые и логические переменные и операции над ними. Всё это если не знакомо, то гуглится и изучается за 10-15 минут, если особо не напрягаться.
Надеюсь, помог с задачей. Если что-то не понятно, то уточните, поясню/отвечу.
Миша Владецкий
Миша Владецкий
4 423
Лучший ответ
Maxim Sumenkov Спасибо большое!
Maxim Sumenkov В пункте 4 так:
Внешний цикл будет: for (int j = 0; j < m - 1; j++), а внутренний for (int i = 0; i < n - 2; j++)? Просто у меня выход за пределы массива.
Maxim Sumenkov Я упростила условие, но на самом деле у меня вот такой замок (чёрным жирным шрифтом выделены стены ). Данный замок зашифрован в виде двоичного кода из 4-ёх позиций ("1", если есть стена, а "0", если нет стены). Каждая ячейка состоит из четырёх сторон и рассматривается в следующем направлении: 1) левая вертикальная сторона - 2) верхняя горизонтальная сторона - 3) правая вертикальная сторона - 4) нижняя горизонтальная сторона.
Maxim Sumenkov В файле у меня записана такая матрица:
1101 0110 1101 0110 1100 0101 0110
1110 1001 0110 1011 1010 1111 1010
1000 0101 0011 1110 1011 1110 1010
1011 1101 0101 0001 0101 0011 1011
Каждая последовательность двоичного кода - это ячейка с четырьмя сторонами.
Maxim Sumenkov Эта матрица типа String. Чтобы взять вертикальную стену из замка, я делала так: matrix[i][j].charAt(0) == '1'. Эта конструкция проверяла, есть ли стена. Получается, что в этом замке 9 вертикальных и 10 горизонтальных стен.
Миша Владецкий Стоп, кажется я неверно понял условие
Миша Владецкий 1101 0110 1101 0110 1100 0101 0110
1110 1001 ...
Для такого случая условия внутри циклов будут другими. В каждой ячейке матрицы, полагаю, содержится 4 символа. Тогда для горизонтальных стен:
for (int i = 0; i <= n - 2; i++) {
. .
for (int j = 0; j <= m - 1; j++) {
. .
}
}
Для вертикальных стен:
for (int i = 0; i <= m - 2; i++) {
. .
for (int j = 0; j <= n - 1; j++) {
. .
}
}
Если важны и "внешние стены", то их нужно будет учесть отдельно
Миша Владецкий Есть более экономичный вариант: проходиться только по выделенным столбцам и строкам (через 1)
Пример для горизонтальных:
for (int i = 0; i < n; i+=2) {
. .
for (int j = 0; j < m; j++) {
/*
тут проверять только второй и четвёртый символ (верхняя и нижняя стена), характеризующий ячейку, также используя 2 логические переменные.
*/
}
}
Maxim Sumenkov Спасибо огромное!
Maxim Sumenkov Извините, что беспокою. А те пункты, которые вы описали изначально, их оставить, то есть переменные v, g, b0, b1? Просто изменить циклы и ко всем if добавить дополнительное условие:
- если горизонтальные стены, то
if (matrix2[i][j].charAt(1) == '0' && matrix2[i + 1][j].charAt(1) == '1' && . .)
- если вертикальные стены, то
if (matrix2[i][j].charAt(0) == '1' && matrix2[i][j].charAt(2) == '1' && . .)
Ну, и плюс я отдельно учту последнюю строку и столбец. Так?
Maxim Sumenkov if (matrix2[i][j].charAt(0) == '0' && matrix2[i + 1][j].charAt(0) == '1')
b1 = true;
if (b0) {
b0 = false;
v += 1;
}
if (matrix2[i][j].charAt(0) == '1' && matrix2[i + 1][j].charAt(0) == '1') {
if (b0 || b1) {
v += 1;
b0 = false;
b1 = false;
}
}
}
}
Maxim Sumenkov for (int i = 0; i < n; i += 2) {
if (b0 || b1) {
g += 1;
b0 = false;
b1 = false;
}
for (int j = 0; j < m; j++) {
if (matrix2[i][j].charAt(1) == '1' && matrix2[i][j + 1].charAt(1) == '0')
b0 = true;
if (b1) {
b1 = false;
g += 1;
}
Maxim Sumenkov if (matrix2[i][j].charAt(1) == '0' && matrix2[i][j + 1].charAt(1) == '1')
b1 = true;
if (b0) {
b0 = false;
g += 1;
}
if (matrix2[i][j].charAt(1) == '1' && matrix2[i][j + 1].charAt(1) == '1') {
if (b0 || b1) {
g += 1;
b0 = false;
b1 = false;
}
}
}
}
System.out.println("Количество вертикальных стен в замке = " + v + ".");
System.out.println("Количество горизонтальных стен в замке = " + g + ".");
}