No Image

Задача шахматная доска python решение

СОДЕРЖАНИЕ
1 523 просмотров
10 марта 2020

Заданы две клетки шахматной доски. Если они покрашены в один цвет, то выведите слово YES , а если в разные цвета — то NO . Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки.

Комментарии

объясните пожалуйста задачу))

то есть решение

Если сумма всех цифр номеров строк и столбцов сложить ,то если цвета одинаковые,то число кратно 2,а иначе, т.е. если цвета разные,то число не кратно 2.

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

Пн Вт Ср Чт Пт Сб Вс

ЕГЭ на соточку для чайников

Прошу прощения, что так долго пропадал. Питошка вернулся, да еще и с группой в вконтакте, подписывайтесь. Помимо этого, на питошке откроется новая рубрика, в которой будут четкие объяснения всех заданий ЕГЭ и ОГЭ по информатике, внимательно прочитав которые, я уверен, вы улучшите свои баллы на экзамене 🙂

Продалжаю решать задачки и знакомиться с языком Python на Питонтьютор. Попалась задачка которая мне очень понравилась и заставила попотеть. Условие:

Заданы две клетки шахматной доски. Если они покрашены в один цвет, то выведите слово YES , а если в разные цвета — то NO . Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки.

И тут меня понесло куда-то не туда. Код конечно заработал, но он оказался так далек от совершенства. После решения мне стал доступен код разработчиков задачи, глянув на него я моментально понял принцип его работы и ведь я мог догадаться. Я должен был догадаться! Все было так просто и изящно. Но. У меня получилось как получилось. Обо всем по порядку.

Я рассуждал так. На шахматной доске клетки располагаются в следующей последовательности, если начинается с белой, следом идет черная, следом белая и так далее. Я принял за точку отсчета белую клетку с координатой (1;1).

Всё дальнейшее рассуждение некорректное, но оставлено как есть чтобы передать ход мыcлей.

Следующая белая имела бы координату (1;3), затем (1;5) и последняя в ряду (1;7). Белые второго ряда имели бы координаты (2;2), (2;4), (2;6), (2;8). Следующий третий ряд повторял бы первый ряд и отсюда уже можно было сделать вывод, что белые в нечетных рядах имеют нечетные координаты а в четных четные и наоборот, черные в нечетных рядах имели бы четные координаты а в четных нечетные. Это уже само по себе подсказывает решение, но я в тот момент этого не понял и решил действовать так, буду сравнивать координаты первой и второй клетки шаг за шагом. Чтобы определять нечетные и четные клетки решил воспользоваться остатком от деления на 2. Четные числа имели бы в остатке 0, так как любое четное число делится на два без остатка, отсюда вытекает обратное, что если число делиться на 2 без остатка то оно четное. А нечетные 1. Но и это не пришло мне в голову, логика отдыхала. Поэтому нечетные клетки я обозначил как остаток отделения не равный 0. Координаты первой клетки обозначались переменными (a;b), а второй (c;d). Условие было таким.

  1. ЕСЛИ первая И вторая координата первой клетки (уже очень глупо получается, но рассуждал я к сожалению именно так) была нечетной ИЛИ первая И вторая координата первой клетки была четной
  2. снова проверяем условие ЕСЛИ первая И вторая координата второй клетки тоже нечетная ИЛИ первая и вторая координата второй клетки тоже четная
  3. выводим на экран YES — т.е. две клетки одного цвета. Поясню. Если бы обе координаты каждой клетки были бы нечетные то как было видно выше в нечетных рядах у нас белые клетки, соответственно обе клетки были бы белые, а с четными координатами черные.
  4. ИНАЧЕ, т.е. если данные не соответствуют вышеперечисленному условию выводим на экран NO — т.е. обе клетки разного цвета. Но! Белая клетка может иметь четные координаты в четных рядах. И если первая клетка получает нечетные координаты а вторая четные, то они обе будут белые но программка напишет NO — они разные. На этом этапе именно так. Поэтому продолжаю условие изначальное условие №1
  5. ИНАЧЕ если первая координата первой клетки нечетная И вторая координата первой клетки четная ИЛИ наоборот первая координата первой клетки четная, а вторая нечетная, проверяем условие
  6. ЕСЛИ первая координата второй клетки нечетная И вторая координата второй клетки четная ИЛИ наоборот первая координата второй клетки четная, а вторая нечетная
  7. выводим на экран YES — т.е. две клетки одного цвета. Это условие исправляет тот недочет, когда первая и вторая клетка могут иметь четные и нечетные координаты соответственно и быть при этом одного цвета.
  8. ИНАЧЕ, т.е. если данные не соответствуют вышеперечисленному условию выводим на экран NO

Данный код прошел все тесты с различными входными данными и успешно выполнил задание.

Что c ним (с кодом) не так? Да наверное все. Это пример того, как не нужно писать код, именно такое программисты называют говнокод.

Как правильно нужно было решить задачу?

Для этого надо было включить логику и хорошенько подумать. Во первых обозначить координаты правильно (x1;y1), а для второй клетки (x2;y2). Если бы я это сделал сразу то тогда возможно понял бы, что не правильно передаю координаты клетки. Для первого ряда координаты белых будут не (1;1), (1;3) и т.д., а (1;1), (3;1)! и т.д.. Для черных (2;1), (4:1) и т.д.. Для второго ряда для белых (2;2), (4;2), а для черных (1;2), (3;2) и т.д.. Всмотримся в координаты повнимательнее. Сумма координатов белых всегда в любом ряду четная, а для черных нечетная! Т.е. можно наугад взять любой столбец по x, например 7 и раз он нечетный значит в сумме с нечетной строкой по y он даст четное число, т.е. белый цвет. Проверим, (7;1) — белый, (7;5) — белый. А в сумме с четным числом даст нечетное, т.е. черный цвет. (7;2) — черный как и (7;6). Что это нам дает? А это нам дает отличное решение.

  1. ЕСЛИ сумма координатов первой клетки четная И сумма координатов второй клетки четнаяИЛИ сумма координатов первой клетки нечетнаяИ сумма координатов второй клетки нечетная
  2. выводим на экран YES — т.е. две клетки одного цвета.
  3. ИНАЧЕ т.е. если данные не соответствуют вышеперечисленному условию выводим на экран NO.

Можно поступить еще проще, просто сравнить остатки от деления на 2 сумм координатов первой и второй клетки, если они равны, то соответственно клетки тоже одинаковые, ведь если обе клетки с четными координатами то остатки будут нулями, а если нечетные то единицей:

Если и дальше рассуждать логически можно прийти к следующему. Сумма координатов каждой из клеток может быть либо четной либо нечетной. А сумма двух четных или двух нечетных чисел всегда будет четное число. Отсюда мы можем написать следующее условие. Если сумма координатов обеих клеток четное число то значит и клетки одинаковые.

Это и есть код разработчиков задачи. Цель моего обучения программированию прийти в итоге к вот таким изящным решениям задач и писать не говнокод, а писать качественный код, лаконичный код, чтобы программки были как можно меньше, менее требовательны к ресурсам при том же функционале и за счет этого были быстрые и качественные. Задачки с шахматами продолжатся, теперь уже с фигурами, про них напишу в следующей заметки, так как эта и так получилась очень объемной.

Опубликованно April 13th, 2018 by Aziz Madazimov

Ответ

Проверено экспертом

Наложим на шахматную доску систему прямоугольных координат так, чтобы в левом нижнем углу была клетка с координатами (1,1) – строка 1, колонка 1. Тогда в правом верхнем углу будет клетка с координатами (8,8) – строка 8, колонка 8. И вспомним, что шахматная доска кладется так, чтобы у игрока, играющего белыми, правое угловое поле было белого цвета. Тогда клетка (1,1) будет черного цвета, как и любая другая, у которой сумма координат четная. А если у клетки сумма координат нечетная, то она будет белого цвета. Собственно, цвет неважен, важно лишь то, что одноцветными клетки будут тогда и только тогда, когда у них обоих сумма координат будет или четным числом, или нечетным.
Отсюда строим алгоритм: вводим координаты первой клетки (r1,c1) и второй клетки (r2,c2). Имена взяты от английских слов Row – строка и Column – колонка. Находим s1=r1+c1 и s2=r2+c2. Если s1 четное и s2 четное, или если s1 нечетное и s2 нечетное, выводим "Yes", в противном случае выводим "No".
Четность s1 в языке Python можно проверить по условию s1%2==0 (остаток от целочисленного деления s1 на 2 равен 0).
Однако такое условие получается очень громоздким и лучше воспользоваться возможностями логических выражений (b – логическая переменная):
если s1 четное, то
b=значение истинности логического выражения (s2=четное)
иначе
b=значение истинности логического выражения (s2=нечетное)
eсли b, то
вывести "Yes"
иначе
вывести "No"

Программа на языке Python 3.4:
r1=int(input("Строка 1=")); c1=int(input("Колонка 1="))
r2=int(input("Строка 2=")); c2=int(input("Колонка 2="))
s1=r1+c1; s2=r2+c2
if s1%2==0:
b=(s2%2==0)
else:
b=(s2%2!=0)
if b:
print("Yes")
else:
print("No")

Тестовое решение:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Строка 1=7
Колонка 1=3
Строка 2=2
Колонка 2=2
Yes
>>>

Комментировать
1 523 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock
detector