IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> ШАХМАТЫ, ПОМОГИТЕ РЕШИТЬ ЗАДАЧУ
Cyber
сообщение 7.03.2010 20:36
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: CyberrMann

Репутация: -  0  +


Помогите!!! Ато убился уже!

Шахматы
(Время: 1 сек. Память: 16 Мб Сложность: 18%)

Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «C7-D5», то программа должна определить это как правильный ход, если же введено «E2-E4», то ход неверный. Так же нужно проверить корректность записи ввода: если например, введено «D9-N5», то программа должна определить данную запись как ошибочную. Помогите ему осуществить эту проверку!

Входные данные


В единственной строке входного файла INPUT.TXT записан текст хода, который указал пользователь. Пользователь не может ввести строку, длиннее 5 символов.
Выходные данные

В выходной файл OUTPUT.TXT нужно вывести «YES», если указанный ход конем верный, если же запись корректна (в смысле правильности записи координат), но ход невозможен, то нужно вывести «NO». Если же координаты не определены или заданы некорректно, то вывести сообщение «ERROR».


входной ---- выходной
C7-D5 ----- YES
E2-E4 ---- NO
BSN --- ERROR

Сообщение отредактировано: Cyber - 7.03.2010 20:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 7.03.2010 22:10
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Держи. Решал на сайте олимпиадного программирования.

uses sysutils;
{$M-}
type point = record
x,y:byte;
end;

var f:textfile;
lets:set of char=['A','B','C','D','E','F','G','H'];
hod:string[10];
h1,h2:point;

Procedure er;
begin
writeln(f,'ERROR');
closefile(f);
halt;
end;

Procedure yes;
begin
writeln(f,'YES');
closefile(f);
halt;
end;

Procedure no;
begin
writeln(f,'NO');
closefile(f);
halt;
end;

function voz(c:char):byte;
var i:char;
sc:byte;
begin
sc:=0;
for i:='A' to 'H' do begin
inc(sc);
if i=c then begin
result:=sc;
exit;
end;
end;
end;

begin
assignfile(f,'input.txt');
reset(f);
readln(f,hod);
closefile(f);
assignfile(f,'output.txt');
rewrite(f);
if length(hod)<>5 then er;
if (not(hod[1] in lets)) or (not(hod[4] in lets)) then er;
if (not(hod[2] in ['1'..'8'])) or (not(hod[5] in ['1'..'8'])) then er;
if hod[3]<>'-' then er;
h1.x:=voz(hod[1]);
h1.y:=strtoint(hod[2]);
h2.x:=voz(hod[4]);
h2.y:=strtoint(hod[5]);
if (h1.x-1=h2.x) and (h1.y+2=h2.y) then yes;
if (h1.x+1=h2.x) and (h1.y+2=h2.y) then yes;
if (h1.x-2=h2.x) and (h1.y+1=h2.y) then yes;
if (h1.x-2=h2.x) and (h1.y-1=h2.y) then yes;
if (h1.x-1=h2.x) and (h1.y-2=h2.y) then yes;
if (h1.x+1=h2.x) and (h1.y-2=h2.y) then yes;
if (h1.x+2=h2.x) and (h1.y-1=h2.y) then yes;
if (h1.x+2=h2.x) and (h1.y+1=h2.y) then yes;
no;
end.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 7.03.2010 22:39
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


ну и условия...
Проще сделать условие
(abs (x1-x2)=1 and abs(y1-y2)=2) or (abs (x1-x2)=2 and abs(y1-y2)=1)
(вроде так)
и проверки на вхождение в размеры доски
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.03.2010 23:07
Сообщение #4


Гость






Цитата
Проще сделать условие
Проще проверить вот так:
  if (abs(h1.x - h2.x) * abs(h1.y - h2.y)) = 2 then yes else no;
. Да и Voz зачем-то переусложнен... Все проще:
function voz(c:char):byte;
begin
voz := Ord( с ) - Ord('A') + 1;
end;
 К началу страницы 
+ Ответить 
Client
сообщение 7.03.2010 23:30
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Проще проверить вот так:
Хитро, проще уже точно некуда smile.gif

Сообщение отредактировано: Client - 7.03.2010 23:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Cyber
сообщение 8.03.2010 7:46
Сообщение #6





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: CyberrMann

Репутация: -  0  +


вот я как сделал:
Код
abs( ord( s[1])- ord( s[4]))+ abs( ord( s[2])-ord (s[5]))= 3

но блин по програме тестеру не проходит даже 1ый тест.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 8.03.2010 11:19
Сообщение #7


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


1. Пользуйся, пожалуйста, тэгами code=pas и /code (см. правила вверху страницы).
Цитата(Cyber @ 8.03.2010 7:46) *
вот я как сделал:
Код
abs( ord( s[1])- ord( s[4]))+ abs( ord( s[2])-ord (s[5]))= 3

но блин по програме тестеру не проходит даже 1ый тест.
Ессно. Пример хода, который годится по твоему тесту, но на самом деле неверен:
A1-A4
Бери алгоритм volvo.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 1:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"