Достаточно простая, но тем не менее интересная задача для разминки программиста. Думаю, все видели, как выглядит шахматная доска, а также слышали выражение «расставить в шахматном порядке». На случай, если не видели, это поле, состоящее размером 8 на 8 клеток, имеющих разные цвета – черный и белый. При этом, клетки одного цвета не могут быть смежными, а расположены через одну: белый, черный, белый… как по вертикали, так и по горизонтали.
Мы выведем в шахматном порядке восемь строк по восемь символов в каждой. Черный цвет у нас будет изображать символ «X», а белый – «O».
Самое первое, что приходит в голову:
Отмечу, что код примера реализован в синтаксисе языка Pascal, но постараюсь писать как можно более универсально, чтобы можно было легко перевести на любой язык программирования. В итоге, самое сложное, что я мог придумать для реализации такого неоптимального алгоритма выглядит следующим образом:
var
i, j : Integer; // переменные для циалов
masChess : array[1..8, 1..8] of Char; // массив с полем
begin
// заполняем массив "белым" цветом
for i := 1 to 8 do
for j := 1 to 8 do
masChess[i, j] := 'O';
// закрашиваем "черным" отдельные ячейки
i := 1;
while (i <= 8) do begin
j := 2;
while (j <= 8) do begin
masChess[i, j] := 'X';
masChess[j, i] := 'X';
j := j + 2;
end;
i := i + 2;
end;
// вывод результата
for i := 1 to 8 do begin
for j := 1 to 8 do
Write(masChess[i, j], ' ');
Writeln;
end;
end.
Пример выше, свою задачу выполняет, но код очень громоздкий. Чтобы заполнить все нужные ячейки, приходится использовать два отдельных присвоения значения как бы в разных плоскостях.
Если подойти к задаче более творчески, можно найти более интересное решение. Для этого достаточно заметить закономерности в расположении клеток. Все они идут через одну по вертикали и по горизонтали. То есть, одноцветные не могут быть рядом. Если присмотреться еще внимательнее, можно заметить еще одну очевидную вещь: номер каждой клетки как по вертикали, так и по горизонтали может быть как четным, так и нечетным. Но главное, что номер каждой «белой» клетки будет одновременно четным или нечетным по каждому направлению. «Черные» клетки при этом будут всегда со разными значениями – одно четное, другое нечетное.
неч | чет | неч | Чет | |
неч | 0 | X | 0 | X |
чет | X | 0 | X | 0 |
неч | 0 | X | 0 | X |
чет | X | 0 | X | 0 |
В итоге, задачу можно решить очень простым и коротким методом: двойной цикл и одно условие, которое будет определять одинаковы ли значения четности каждой клетки.
var
i, j : Integer; // переменные для циалов
masChess : array[1..8, 1..8] of Char; // массив с полем
begin
// заполняем все ячейки
for i := 1 to 8 do
for j := 1 to 8 do
if odd(i) = odd(j) then
masChess[i, j] := 'O'
else
masChess[i, j] := 'X';
// вывод результата
for i := 1 to 8 do begin
for j := 1 to 8 do
Write(masChess[i, j], ' ');
Writeln;
end;
end.
Большинство задач можно решить различными способами. Работа же программиста найти наиболее функциональный и грамотный метод, позволяющий выполнить поставленную задачу наиболее эффективным путем.
В комментариях запрещено публиковать рекламные материалы. Все сообщения оправляются на модерацию и будут опубликованы, если не нарушают правил сайта после проверки.