Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2016, 21:31   #1
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
Сообщение Олимпиадная задача "Шахматы" (помогите Васе проверить правильность записи о ходе коня)

Привет, есть задача..

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

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

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

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

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

Примеры

№ INPUT.TXT OUTPUT.TXT
1 C7-D5 YES
2 E2-E4 NO
3 BSN ERROR

Я ее решил, отправил решение, мне упорно выводит сообщение, что неправильно. Перепробовал все варианты, выводит, как надо. Не знаю, в чем проблема.. Может вы сможете придумать вариант, который не решит моя задача.


Код:
program Project1;
var st,st1,st2:string[5]; j:char;
	i,flaq,k,k1,k2,k3,k4,c:integer;
begin
	k:=0;
	writeln('Введите ход коня ');
    read(st);
    if (st[1] in ['A'..'H']) and (st[2] in ['1'..'8']) and (st[3]='-') and (st[4] in ['A'..'H']) and (st[5] in ['1'..'8']) then flaq:=1
    	else begin write ('ERROR');
        exit;
        end;
    for j:='A' to 'H' do begin
    	k:=k+1;
    	if st[1]=j then
        	str(k,st1);
        if st[4]=j then
        	str(k,st2);
    end;
    val(st[2],k2,c);
    val(st[5],k4,c);
    val(st1,k1,c);
    val(st2,k3,c);
    if sqrt(sqr(k3-k1)+sqr(k4-k2))=sqrt(5) then
    	write ('YES')
        else
        write ('NO');
    readln;
    readln;
end.
NikiToZz_ вне форума Ответить с цитированием
Старый 03.06.2016, 21:50   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Код:
  if sqrt(sqr(k3-k1)+sqr(k4-k2))=sqrt(5) then
в результате сравниваются вещественные числа, значения которых могут различаться в одном самом малом разряде.

k1 и k3 можно вычислять
Код:
  k1:=ord(st[1])-ord('A')+1;
  k3:=ord(st[4])-ord('A')+1;

Последний раз редактировалось FPaul; 03.06.2016 в 21:55.
FPaul вне форума Ответить с цитированием
Старый 03.06.2016, 21:51   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Во нагородил проверку, и цикл, и квадраты и корни. Там одной строчкой проверяется
Код:
  if Abs(Ord(st[1])-Ord(st[4]))*Abs(Ord(st[2])-Ord(st[5]))=2 then write ('YES') else write ('NO');
А ошибку в твоем коде влом искать

PS уже и нашли. Может еще чего найдется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.06.2016 в 21:54.
Аватар вне форума Ответить с цитированием
Старый 03.06.2016, 22:13   #4
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Во нагородил проверку, и цикл, и квадраты и корни. Там одной строчкой проверяется
Код:
  if Abs(Ord(st[1])-Ord(st[4]))*Abs(Ord(st[2])-Ord(st[5]))=2 then write ('YES') else write ('NO');
А ошибку в твоем коде влом искать

PS уже и нашли. Может еще чего найдется
Дак и в твоем коде ошибку признает система проверки =( Вот здесь тобишь:

Код:
program Project1;
var st,st1,st2:string[5]; j:char;
	i,flaq,k,k1,k2,k3,k4,c:integer;
begin
	k:=0;
	writeln('Введите ход коня ');
    read(st);
    if (st[1] in ['A'..'H']) and (st[2] in ['1'..'8']) and (st[3]='-') and (st[4] in ['A'..'H']) and (st[5] in ['1'..'8']) then flaq:=1
    	else begin write ('ERROR');
        exit;
        end;
     if Abs(Ord(st[1])-Ord(st[4]))*Abs(Ord(st[2])-Ord(st[5]))=2 then write ('YES') else write ('NO');
    readln;
    readln;
end.
NikiToZz_ вне форума Ответить с цитированием
Старый 03.06.2016, 22:15   #5
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от FPaul Посмотреть сообщение
Код:
  if sqrt(sqr(k3-k1)+sqr(k4-k2))=sqrt(5) then
в результате сравниваются вещественные числа, значения которых могут различаться в одном самом малом разряде.

k1 и k3 можно вычислять
Код:
  k1:=ord(st[1])-ord('A')+1;
  k3:=ord(st[4])-ord('A')+1;
Думаю, все же в первой части ошибка... С Error связанная
NikiToZz_ вне форума Ответить с цитированием
Старый 03.06.2016, 22:17   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Это твой код. Кто будет проверять, что строка ровно 5 символов, а не 4 скажем?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.06.2016, 22:22   #7
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
строка ровно 5 символов, а не 4 скажем?
Error за это отвечает.. Мне кажется, что ошибка именно здесь:
Код:
if (st[1] in ['A'..'H']) and (st[2] in ['1'..'8']) and (st[3]='-') and (st[4] in ['A'..'H']) and (st[5] in ['1'..'8']) then flaq:=1
    	else begin write ('ERROR');
, как то по-другому можно проверить..
NikiToZz_ вне форума Ответить с цитированием
Старый 03.06.2016, 22:47   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Код:
if length(st)=5 then
FPaul вне форума Ответить с цитированием
Старый 04.06.2016, 00:03   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

чот я увлёкся...
кто-нить скажет мне, дураку, чего я тут понаписал, а?

Код:
function TryStrToCell(const s: string; var cell: byte): Boolean;
begin
  Result:= (s.Length = 2) and 
    CharInSet(s[1], ['A'..'H']) and 
    CharInSet(s[2], ['1'..'8']);
    
  if not Result  
    then exit;
    
  cell:= ((byte(s[1]) - $41) shl 4) or (byte(s[2]) - $31);
end;

function CellToStr(const cell: byte): string;
begin
  Result:= Char($41 + (cell shr 4)) + 
           Char($31 + (cell and $F));
end;

{ cell: буква кодируется ст. тетрадой 
        (A <--> 0, B <--> 1, ..., H <--> 7)
        цифра кодируется мл. тетрадой 
        (1 <--> 0, 2 <--> 1, ..., 8 <--> 7)
        биты 3 и 7 используются для проверки диапазонов.
  Пример: "G2" <---> 6:1 = bin(0110:0001). }

function ValidMoves(const cell: byte): TByteSet;
const
  SHIFT_H: array[0..7] of int8 = (+2, +1, -1, -2, -2, -1, +1, +2);
  SHIFT_V: array[0..7] of int8 = (+1, +2, +2, +1, -1, -2, -2, -1);
var
  x, y, mx, my, idx: int8;  
begin
  Result:= [];
  x:= 7 and (cell shr 4);
  y:= cell and 7;
  
  for idx:= 0 to 7 do
    begin
      mx:= x + SHIFT_H[idx];
      my:= y + SHIFT_V[idx];
      if (mx or my) in [0..7]
        then include(Result, (mx shl 4) or my);
    end;  
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.06.2016, 01:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я бы написал так:
Код:
program Project1;
var s:string[5];
  i : integer;
begin
   read(s);
   for i:=1 to Length(s) do s[i] := UpCase(s[i]);

   if (length(s)=5) and (s[1] in ['A'..'H']) and (s[2] in ['1'..'8']) and (s[3]='-')
        and (s[4] in ['A'..'H']) and (s[5] in ['1'..'8']) then
        begin
          if Abs(Ord(s[1])-Ord(s[4]))*Abs(Ord(s[2])-Ord(s[5]))=2 then write('YES') else write('NO');
        end
       	else write('ERROR');
end.

NikiToZz_, если Вы сдаёте программу через систему автоматического тестирования, то Вы не забыли сделать открытие файла INPUT.TXT на чтение и выходного файла OUTPUT.TXT на запись?

т.е. если речь идёт про https://acmp.ru/asp/do/index.asp?mai...id_problem=242

то добавьте в начало программы:
Код:
  reset(input, 'input.txt');
  rewrite(output, 'output.txt');

Последний раз редактировалось Serge_Bliznykov; 04.06.2016 в 02:02.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить правильность программы. JellyFilled Паскаль, Turbo Pascal, PascalABC.NET 4 21.10.2014 08:28
Проверить правильность скобок (С++) Cheat Помощь студентам 24 03.02.2013 19:34
вторая олимпиадная задача-проверить наличие номера в телефонной книге Руслан666 Паскаль, Turbo Pascal, PascalABC.NET 1 02.12.2012 16:02
"Задача о ходе коня" на языке С Student2012 Помощь студентам 0 02.01.2012 14:21
Задача о ходе коня McFrey Помощь студентам 2 22.12.2011 23:26