Ю4.25

Задача: Заполнить матрицу заданного размера [latex]M(k,l)[/latex] числами 1,2,3,4 так, чтобы по горизонтали, вертикали и диагонали не было одинаковых рядом стоящих чисел.

[latex]k[/latex] [latex]l[/latex] Output
6 6 1 2 3 4 1 2
3 4 1 2 3 4
1 2 3 4 1 2
3 4 1 2 3 4
1 2 3 4 1 2
3 4 1 2 3 4
5 5 1 2 3 4 1
3 4 1 2 3
1 2 3 4 1
3 4 1 2 3
1 2 3 4 1
Код на Ideone.

Заполняем массив с помощью формулы (j + 2 * (i % 2)) % 4 + 1. При i четном 2 * (i % 2) будет обращаться в 0. То есть в нечетных строках будут числа 1, 2, 3, 4 подряд, а в четных строках будут меняться цифры 1 на 3, 2 на 4, 3 на 1, 4 на 2.

Код программы на Java:

Код на Ideone.

Related Images:

3 thoughts on “Ю4.25

  1. — Строки 12-18 можно заменить одним присваиванием a[i][j] = j % 4 + 1
    — В пояснении не указали, что замены выполняются не во всех строках, а через одну.
    — Можно не присваивать, а потом менять, а сразу присваивать то, что нужно. Например, такое присваивание a[i][j] = (j % 4 + 2 * (i % 2)) % 4 + 1; даёт такие же значения, как и у Вас, но за один проход без if и switch. Возможно и проще как-то можно сделать.

    • Действительно. Спасибо, мой код сократился в 2.5 раз. a[i][j] = (j % 4 + 2 * (i % 2)) % 4 + 1 можно поменять на a[i][j] = (j + 2 * (i % 2)) % 4 + 1.

  2. Зачтено.

    Есть одно «методическое» замечание.
    Не рекомендуется печатать элементы массива в том же цикле, в котором Вы их изменяете. Могут возникнуть (и часто возникают!) неприятные ошибки. Т.е. на печать может быть выведено всё правильно, а в массиве будет что-то совсем другое.

    Обычно стараются вывод делать в отдельном цикле, хоть это и дополнительный код и время.

    Можно не переделывать, просто имейте в виду в будущем.

Добавить комментарий