Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ ШАХМАТЫ

Автор: Cyber 8.03.2010 0:36

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

Шахматы
(Время: 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 8.03.2010 2:10

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

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 8.03.2010 2:39

ну и условия...
Проще сделать условие

(abs (x1-x2)=1 and abs(y1-y2)=2) or (abs (x1-x2)=2 and abs(y1-y2)=1)
(вроде так)
и проверки на вхождение в размеры доски

Автор: volvo 8.03.2010 3:07

Цитата
Проще сделать условие
Проще проверить вот так:
  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 8.03.2010 3:30

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

Автор: Cyber 8.03.2010 11:46

вот я как сделал:

Код
abs( ord( s[1])- ord( s[4]))+ abs( ord( s[2])-ord (s[5]))= 3

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


Автор: Lapp 8.03.2010 15:19

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 31.10.2021 2:00

Levitra 10 Mg Bayer Precio

Автор: hydroxychloroquine for sale amaz 4.12.2021 11:51

Hidradenitis Suppurativa Amoxicillin