Задача шахматы acmp python

Разбор олимпиадной задачи — Шахматы

Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «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 >

Источник

Читайте также:  Setting response header in php

Решение задачи Шахматы с 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-м ряду доски. По этой информации Вася попытался определить, клеток какого цвета на доске больше.

Читайте также:  Как работает less css

Требуется написать программу, которая по размерам доски и цвету 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

Похожие видео

Видео: Разбор задачи 525 acmp.ru Сумма степеней двойки. Решение на C++

Видео: Разбор задачи 1157 acmp.ru Подпалиндромы. Решение на C++

Видео: УПРАВЛЕНЧЕСКИЙ УЧЕТ с нуля до ЭКСПЕРТА: основы, подводные камни, эффективные решения

Видео: Управляем Arduino с компьютера. Python + PyQt5

Видео: Азы программирования в 1С за 3 часа

Видео: 20 приемов и трюков MS Excel для продвинутых

Видео: урок 1 Основы библиотеки Pygame

Видео: Пакеты в Python. Файл __init__, переменная __all__

Видео: Разбор задачи 1024 leetcode.com Video Stitching

Видео: Python для начинающих. Урок 1: Введение, Hello world и Переменные.

Видео: Как поднять домашний сервер со своим доменом своими руками?

Видео: VS Code настройка установка плагины // Подробный гайд VS Code за час // VS Code видео обучение

© 2005 — 2023 «Каталог сайтов No FolloW ». В каталоге 85020 сайтов.
Права на все материалы, размещённые на этом сайте принадлежат их авторам. Хостинг Разместить рекламу

Источник

Оцените статью