ЗАДАНИЕ: 20)поля (x1, y1) и (x2, y2) шахматной доски имеют одинаковый цвет (x1, x2, y1, y2 – целые от 1 до 8);
МОЙ КОД:
#include "stdio.h"
#include "math.h"
#include "clocale"
#include "conio.h"
int main()
{
setlocale(LC_ALL, "Russian");
bool U;
int a, a1, b, b1;
printf("Выберите две одинаковые ячейки: \n");
printf_s("a: ");
scanf_s("%d", &a);
printf_s("a1: ");
scanf_s("%d", &a1);
printf_s("b: ");
scanf_s("%d", &b);
printf_s("b1: ");
scanf_s("%d", &b1);
if ((a > 0) && (a <= 8) && (a1 > 0) && (a1 <= 8) && (b > 0) && (b <= 8) && (b1 > 0) && (b1 <= 8)) U = true;
else U = false;
// условия для черных
if (((a % 2 == 0) && (a1 % 2 == 0)) && ((b % 2 != 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 != 0) && (a1 % 2 != 0)) && ((b % 2 == 0) && (b1 % 2 == 0))) U = true;
else U = false;
if (((a % 2 != 0) && (a1 % 2 != 0)) && ((b % 2 != 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 == 0)) && ((b % 2 == 0) && (b1 % 2 == 0))) U = true;
else U = false;
// условия для белых
if (((a % 2 != 0) && (a1 % 2 == 0)) && ((b % 2 == 0) && (b1 % 2 != 0))) U = true;
else;
if (((a % 2 != 0) && (a1 % 2 == 0)) && ((b % 2 != 0) && (b1 % 2 == 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 != 0)) && ((b % 2 == 0) && (b1 % 2 != 0))) U = true;
else U = false;
if (((a % 2 == 0) && (a1 % 2 != 0)) && ((b % 2 != 0) && (b1 % 2 == 0))) U = true;
else U = false;
if (U) {
printf("Одного цвета! \n");
}
else {
printf("Разного цвета! \n");
}
}
Другие языки программирования и технологии
Почему вечно выдаёт "false"( разный цвет)?
Для "шахматной" доски цвет клетки с координатами row, col равен:
(row + col) % 2
Потому проверка того, что две клетки имеют один цвет выполняется простейшим выражением:
U = (row1 + col1) % 2 == (row2 + col2) % 2;
Результатом операции == УЖЕ является true / false, потому if НЕ НУЖЕН.
(row + col) % 2
Потому проверка того, что две клетки имеют один цвет выполняется простейшим выражением:
U = (row1 + col1) % 2 == (row2 + col2) % 2;
Результатом операции == УЖЕ является true / false, потому if НЕ НУЖЕН.
Влияние на U оказывает только самый последний if. То, что делают все предыдущие, им перезаписывается.
Вообще, код очень грязный. Я понимаю, что до красивой формулы в одну строчку можно и не додуматься, но когда у тебя стена похожих друг на друга строчек, идущих подряд, это почти всегда очень плохо и легко исправляется.
Ты не думал, например, ввести для каждой клетки по переменной и в каждую из которых занести 0/1 в зависимости от того, черная эта клетка или белая, и потом их сравнить? Или вообще вынести код вычисления цвета клетки в отдельную функцию?
Вообще, код очень грязный. Я понимаю, что до красивой формулы в одну строчку можно и не додуматься, но когда у тебя стена похожих друг на друга строчек, идущих подряд, это почти всегда очень плохо и легко исправляется.
Ты не думал, например, ввести для каждой клетки по переменной и в каждую из которых занести 0/1 в зависимости от того, черная эта клетка или белая, и потом их сравнить? Или вообще вынести код вычисления цвета клетки в отдельную функцию?
Юрий Прозоровский
извините, я только начал изучать с++
Если присмотреться к доске, то можно заметить, что:
• Для чёрных клеток чётность горизонтали и вертикали одинакова.
• Для белых клеток чётность горизонтали и вертикали различна.
==========================================================================
Важное свойство чётности суммы: Сумма двух чисел одинаковой чётности всегда чётна, сумма двух чисел различной чётности всегда нечётна
==========================================================================
Это значит, что:
• Сумма номеров горизонтали и вертикали чёрной клетки всегда чётная.
• Сумма номеров горизонтали и вертикали белой клетки всегда нечётная.
Из этого следует:
• Сумма номеров горизонталей и вертикалей двух клеток ОДИНАКОВОГО цвета всегда чётная!
• Сумма номеров горизонталей и вертикалей одной белой и одной чёрной клеток всегда нечётная! (чёрной или белой может быть любая из клеток).
Таким образом достаточно вычислить сумму заданных номеров горизонталей и вертикалей обеих клеток и определить её чётность.
• Для чёрных клеток чётность горизонтали и вертикали одинакова.
• Для белых клеток чётность горизонтали и вертикали различна.
==========================================================================
Важное свойство чётности суммы: Сумма двух чисел одинаковой чётности всегда чётна, сумма двух чисел различной чётности всегда нечётна
==========================================================================
Это значит, что:
• Сумма номеров горизонтали и вертикали чёрной клетки всегда чётная.
• Сумма номеров горизонтали и вертикали белой клетки всегда нечётная.
Из этого следует:
• Сумма номеров горизонталей и вертикалей двух клеток ОДИНАКОВОГО цвета всегда чётная!
• Сумма номеров горизонталей и вертикалей одной белой и одной чёрной клеток всегда нечётная! (чёрной или белой может быть любая из клеток).
Таким образом достаточно вычислить сумму заданных номеров горизонталей и вертикалей обеих клеток и определить её чётность.
Денис Максимовский
Вариант вывода:
printf ("%s цвета! \n", (bool)((a + a1 + b + b1) & 1) ? "Разного" : "Одного");
printf ("%s цвета! \n", (bool)((a + a1 + b + b1) & 1) ? "Разного" : "Одного");
Денис Максимовский
И кстати, сократи приглашение:
printf ("Выберите две клетки: \n");
// слово „одинаковые” неуместно!
printf ("Выберите две клетки: \n");
// слово „одинаковые” неуместно!
Похожие вопросы
- Помогите!! ! Почему я ввожу один код цвета в html, а он выдает абсолютно другой??? p.s. пишу стhаницы сайта в блокноте
- Почему PASCAL выдает ошибку?
- ассемблер, Как сделать мигание разными цветами?
- Почему вечно ругают php?
- Составить программу, печатающую значение true, если указанное явление истинно, и false в противном случае.
- Pascal. Почему выдает ошибку? Помогите отладить
- 3d max выдаёт ошибку...
- Синий экран смерти выдает ошибку 0х0000008е
- Почистил комп от пыли и теперь выдаёт ошибку....
- как в CorelDraw за минимальное кол-во действий, перевести красный цвет в черный?