Помощь - Поиск - Пользователи - Календарь
Полная версия: ШАХМАТЫ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Cyber
Помогите!!! Ато убился уже!

Шахматы
(Время: 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
Unconnected
Держи. Решал на сайте олимпиадного программирования.

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.
Client
ну и условия...
Проще сделать условие
(abs (x1-x2)=1 and abs(y1-y2)=2) or (abs (x1-x2)=2 and abs(y1-y2)=1)
(вроде так)
и проверки на вхождение в размеры доски
volvo
Цитата
Проще сделать условие
Проще проверить вот так:
  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
Цитата
Проще проверить вот так:
Хитро, проще уже точно некуда smile.gif
Cyber
вот я как сделал:
Код
abs( ord( s[1])- ord( s[4]))+ abs( ord( s[2])-ord (s[5]))= 3

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

Lapp
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.
buy cialis online with a prescri
Levitra 10 Mg Bayer Precio
hydroxychloroquine for sale amaz
Hidradenitis Suppurativa Amoxicillin
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.