Разбор олимпиадной задачи — Шахматы
Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «C7-D5», то программа должна определить это как правильный ход, если же введено «E2-E4», то ход неверный. Так же нужно проверить корректность записи ввода: если например, введено «D9-N5», то программа должна определить данную запись как ошибочную. Помогите ему осуществить эту проверку! Входные данные:
В единственной строке входного файла INPUT.TXT записан текст хода (непустая строка), который указал пользователь. Пользователь не может ввести строку, длиннее 5 символов. Выходные данные:
В выходной файл OUTPUT.TXT нужно вывести «YES», если указанный ход конем верный, если же запись корректна (в смысле правильности записи координат), но ход невозможен, то нужно вывести «NO». Если же координаты не определены или заданы некорректно, то вывести сообщение «ERROR».
Задачу можно условно разделить на две части — проверку входных данных и собственно решение шахматной задачи о ходе коня. Считывать с файла проще всего строку. Проверить, что она состоит из 5 символов, второй символ — тире, нулевой и третий — буквы, а первый и четвертый — цифры. Причем не любые буквы и цифры, а в диапазоне [‘A’, ‘H’] и [‘1, ‘9’]. Для осуществления такой проверки я написал две вспомогательные функции:
bool isChessAlpha(char c) < return c >= ‘A’ && c bool isChessDigit(char c) < return c >= ‘1’ && c
Чтобы в коде программы было меньше «магических чисел» (код был чище), позиции символов строки можно занести в перечисление (enum):
Дальнейшие проверки тривиальны. Но как же быть с ходом шахматного коня? — все просто, за один шаг он смещается на две клетки в одну сторону и на одну клетку в другую. Использовать можно тот факт, что символы кодируются с помощью чисел (см. ASCII коды), причем у цифр и символов английского алфавита коды идут подряд. Таким образом, вычитанием кодов символов можно получить смещение коня на доске, а затем выполнить нехитрую проверку (по одной оси 2, а по другой — 1 клетка). Итак, код программы целиком:
#include using namespace std; bool isChessAlpha(char c) < return c >= 'A' && c bool isChessDigit(char c) < return c >= '1' && c int main() < enum Position < alpha1, digit1, dash, alpha2, digit2 >; std::string str; ifstream ifst("input.txt"); ofstream ofst("output.txt"); ifst >> str; if (str.size() != 5 || str[dash] != '-' || !isChessAlpha(str[alpha1]) || !isChessAlpha(str[alpha2]) || !isChessDigit(str[digit1]) || !isChessDigit(str[digit2]) ) < ofst int dx = std::abs(str[alpha1] - str[alpha2]), dy = std::abs(str[digit1] - str[digit2]); if ((dx == 1 && dy == 2) || (dx == 2 && dy == 1)) < ofst else < ofst >
Решение задачи Шахматы с Acmp
Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «C7-D5», то программа должна определить это как правильный ход, если же введено «E2-E4», то ход неверный. Так же нужно проверить корректность записи ввода: если например, введено «D9-N5», то программа должна определить данную запись как ошибочную. Помогите ему осуществить эту проверку!
Код
#include using namespace std; int main() < string str; cin >> str; if(str[1]=='0' || str[4]=='0' || str[1]=='9' || str[4]=='9' || str.size()!=5 || str[2] !='-') < cout if(str[0]=='A') str[0] = '1'; else if(str[0]=='B') str[0] = '2'; else if(str[0]=='C') str[0] = '3'; else if(str[0]=='D') str[0] = '4'; else if(str[0]=='E') str[0] = '5'; else if(str[0]=='F') str[0] = '6'; else if(str[0]=='G') str[0] = '7'; else if(str[0]=='H') str[0] = '8'; else < cout if(str[3]=='A') str[3] = '1'; else if(str[3]=='B') str[3] = '2'; else if(str[3]=='C') str[3] = '3'; else if(str[3]=='D') str[3] = '4'; else if(str[3]=='E') str[3] = '5'; else if(str[3]=='F') str[3] = '6'; else if(str[3]=='G') str[3] = '7'; else if(str[3]=='H') str[3] = '8'; else < cout if(abs(str[0] - str[3])==1 && abs(str[1] - str[4])==2 || abs(str[0] - str[3])==2 && abs(str[1] - str[4])==1) cout
         
Автор: Администратор
Шахматная доска - 2, задача по программированию
Аня разделила доску размера m × n на клетки размера 1×1 и раскрасила их в черный и белый цвет в шахматном порядке. Васю заинтересовал вопрос: клеток какого цвета получилось больше – черного или белого.
Для того чтобы выяснить это, он спросил у Ани, в какой цвет она раскрасила j-ю клетку в i-м ряду доски. По этой информации Вася попытался определить, клеток какого цвета на доске больше.
Требуется написать программу, которая по размерам доски и цвету j-й клетки в i-м ряду определит, клеток какого цвета на доске больше — черного или белого.
Входные данные
Входной файл INPUT.TXT содержит пять целых чисел: m, n, i, j и c (1 ≤ m, n ≤ 109, 1 ≤ i ≤ m, 1 ≤ j ≤ n, с = 0 или с = 1). Значение c = 0 означает, что j-я клетка в i-м ряду доски раскрашена в черный цвет, а значение c = 1 – в белый цвет.
Выходные данные
В выходной файл OUTPUT.TXT выведите одно из трех слов:
black, если черных клеток на доске больше,
white, если белых клеток на доске больше,
equal, если черных и белых клеток на доске поровну.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
r = open('input.txt', 'r') w = open('output.txt', 'w') input_val = r.readline().split(' ') m = int(input_val[0]) n = int(input_val[1]) i = int(input_val[2]) j = int(input_val[3]) c = int(input_val[4]) def first_color(i, j, c): if c == 0: ans = 'black' reans = 'white' else: ans = 'white' reans = 'black' if (i == 1 and j == 1) or (j % 2 != 0 and i % 2 != 0) or (i % 2 == 0 and j % 2 == 0): return ans else: return reans black_num = 0 white_num = 0 if first_color(i, j, c) == 'black': for i in range(n*m): if i % 2 == 0: black_num += 1 else: white_num += 1 else: for i in range(n*m): if i % 2 == 0: white_num += 1 else: black_num += 1 if black_num > white_num: w.write('black') elif black_num white_num: w.write('white') else: w.write('equel') [PYTHON]
Помогите найти ошибку. Проверяющая система выдает 'Wrong answer' на третьем тесте
Решение задачи Шахматный конь с Acmp
Вася решил научиться играть в шахматы. Он нашел книгу с записями партий и внимательно их изучает. Может быть, когда-нибудь Вася станет великим шахматистом, но пока он еще учится в начальной школе, и ему нелегко дается шахматная нотация. Больше всего трудностей у Васи вызывают ходы шахматного коня. Он попросил вас написать программу, которая сможет сообщить Васе, на какие клетки можно пойти конем с заданной клетки.
Вы, наверное, тоже знаете, что конь в шахматах всегда перемещается либо на две клетки по горизонтали и на одну по вертикали, либо на одну по горизонтали и на две по вертикали. Вертикали обозначаются маленькими английскими буквами от a до h, а горизонтали - цифрами от 1 до 8. Любая клетка на шахматной доске обозначается буквой соответствующей вертикали и цифрой соответствующей горизонтали, например, c6 или e2.
Код
#include using namespace std; int main() < string n; cin >> n; if(n[0] - 1 >='a' && n[0] - 1 ='1' && n[1] - 2 <='8') cout << char(n[0] - 1) << char(n[1] - 2) << endl; if(n[0] - 2 >='a' && n[0] - 2 ='1' && n[1] - 1 <='8') cout << char(n[0] - 2) << char(n[1] - 1) << endl; if(n[0] - 2 >='a' && n[0] - 2 ='1' && n[1] + 1 <='8') cout << char(n[0] - 2) << char(n[1] + 1) << endl; if(n[0] - 1 >='a' && n[0] - 1 ='1' && n[1] + 2 <='8') cout << char(n[0] - 1) << char(n[1] + 2) << endl; if(n[0] + 1 >='a' && n[0] + 1 ='1' && n[1] + 2 <='8') cout << char(n[0] + 1) << char(n[1] + 2) << endl; if(n[0] + 2 >='a' && n[0] + 2 ='1' && n[1] + 1 <='8') cout << char(n[0] + 2) << char(n[1] + 1) << endl; if(n[0] + 2 >='a' && n[0] + 2 ='1' && n[1] - 1 <='8') cout << char(n[0] + 2) << char(n[1] - 1) << endl; if(n[0] + 1 >='a' && n[0] + 1 ='1' && n[1] - 2
         
Автор: Администратор
Разбор задачи 156 acmp.ru Шахматы - 2. Решение на Python
Теги: комбинаторика,особые случаи,оценка максимального значения,количество сочетаний,количество размещений О проекте "3.5 задачи в неделю": разбор олимпиадных задач по программированию каждые 2 дня в прямом эфире в 10 вечера по Москве. Более подробно
В проекте разобрано более 250 задач acmp.ru, общая длина видео разборов более 150 часов. Список всех разборов, доступных участникам проекта, приведён в таблице
В седьмом столбце указаны теги - темы задач. Как стать участником проекта, написано в статье
Участие бесплатно. Ведущий проекта Меньшиков Фёдор Владимирович, автор книги "Олимпиадные задачи по программированию". Разборы более простых задач в проекте "Олимпиадное программирование с нуля на Java" https://www.youtube.com/channel/UCwZIfY8SZvct6_nYkjmODrg
По поводу индивидуальных занятий по подготовке к олимпиадам обращайтесь по адресу mfv@mail.ru
Похожие видео
© 2005 — 2023 «Каталог сайтов No FolloW ». В каталоге 85020 сайтов.
Права на все материалы, размещённые на этом сайте принадлежат их авторам. Хостинг Разместить рекламу