Задача: Заполнить матрицу заданного размера [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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> using namespace std; int main() { int k, l; cin >> k >> l; int a[k][l]; for(int i = 0; i < k; i++) { for(int j = 0; j < l; j++) { a[i][j] = (j + 2 * (i % 2)) % 4 + 1; cout << a[i][j] << " "; } cout << "\n"; } return 0; } |
Заполняем массив с помощью формулы (j + 2 * (i % 2)) % 4 + 1. При i четном 2 * (i % 2) будет обращаться в 0. То есть в нечетных строках будут числа 1, 2, 3, 4 подряд, а в четных строках будут меняться цифры 1 на 3, 2 на 4, 3 на 1, 4 на 2.
Код программы на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Main { public static void main (String[] s) throws java.lang.Exception { java.util.Scanner in = new java.util.Scanner(System.in); int k = in.nextInt(); int l = in.nextInt(); int[][]a = new int[k][l]; for(int i = 0; i < k; i++) { for(int j = 0; j < l; j++) { a[i][j] = (j + 2 * (i % 2)) % 4 + 1; System.out.print(a[i][j]); System.out.print(" "); } System.out.print("\n"); } } } |
— Строки 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.
Зачтено.
Есть одно «методическое» замечание.
Не рекомендуется печатать элементы массива в том же цикле, в котором Вы их изменяете. Могут возникнуть (и часто возникают!) неприятные ошибки. Т.е. на печать может быть выведено всё правильно, а в массиве будет что-то совсем другое.
Обычно стараются вывод делать в отдельном цикле, хоть это и дополнительный код и время.
Можно не переделывать, просто имейте в виду в будущем.