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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2012, 20:48   #1
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию Проблема с задачей "Шахматы" (Pascal)

Данная задача есть на сайте школа программистов

Написал программу, на сайте робот не пропускает по 2-му тесту: Wrong answer. Все ломаю голову, не пойму что не так.

Вот код программы с пояснениями для вас:

Код:
const mas='ABCDEFGH'; nas='12345678';
var x1,y1,x2,y2,t:char; a,b,c,d,i:integer;
Label l;
begin

{ну эти 2 строчки должны быть в каждой отсылаемой программе}
assign (input, 'input.txt'); reset(input);
assign (output, 'output.txt'); rewrite(output);

a:=0; b:=0;
read(x1,y1,t,x2,y2);

{здесь проверяем корректность записи координат коня}
{t - это "черточка" между 2-мя координатами. Переменная t всегда должна быть равна символу "-"}
if (t<>'-') then goto l else
begin

{здесь идет счетчик, если a или b будет не равен 2, то координаты некорректны}
for i:=1 to 8 do
 begin
 if x1=mas[i] then a:=a+1; 
end;
for i:=1 to 8 do
 begin
 if x2=mas[i] then a:=a+1;
end;
for i:=1 to 8 do
 begin
 if y1=nas[i] then b:=b+1;
end;
for i:=1 to 8 do
 begin
 if y2=nas[i] then b:=b+1;  
end;
if (a<>2)or(b<>2) then write('ERROR');

{если координаты положения коня верны, проверяет правильность и корректность хода}
if (a=2)and(b=2) then 
 begin
 c:=0; d:=0;
 if (x2=succ(x1))or(x2=pred(x1))then c:=c+1 else
 begin
  if (succ(x2)=pred(x1))or(succ(x1)=pred(x2)) then c:=c+1;
 end;
 if (succ(y1)=pred(y2))or(succ(y2)=pred(y1)) then d:=d+1 else
 begin
   if (y2=succ(y1))or(y2=pred(y1)) then d:=d+1;
 end;
 end;
end;
if (c=1)and(d=1) then write('YES') else write('NO'); exit;
l:  write('ERROR');
end.
Upd:
Пока писал тему, пришло в голову, что надо было в строчке
Код:
if (a<>2)or(b<>2) then write('ERROR');
либо дописать exit; либо goto l;
Нет, все-равно не прошел 2й тест.

Последний раз редактировалось Ghost3; 28.10.2012 в 20:59.
Ghost3 вне форума Ответить с цитированием
Старый 28.10.2012, 21:09   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
var
  s: string;

function check(s: string): boolean;
begin
  check := (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']);
end;

begin
  assign(input, 'input.txt'); reset(input);
  assign(output, 'output.txt'); rewrite(output);
  readln(s);
  if check(s) then
  begin
    if sqr(ord(s[1]) - ord(s[4])) + sqr(ord(s[2]) - ord(s[5])) = 5 then
      writeln('YES')
    else
      writeln('NO');  
  end
  else
    writeln('ERROR');
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.10.2012, 21:14   #3
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Спасибо конечно, за готовое решение (не проверял конечно на правильность), но мне важно понимать в чем моя ошибка.
Ghost3 вне форума Ответить с цитированием
Старый 28.10.2012, 21:20   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пожалуйста. Я подумал, что решение, проходящее тесты, даст Вам пищу для размышлений.
Во-первых, не знаю, как поведет себя рид при отсутствии 5 символов.
Во-вторых, у Вас сложная логика решения, имхо.

Не могу дать конструктивных советов по поводу ошибок
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.10.2012, 21:25   #5
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Код:
function check(s: string): boolean;
begin
  check := (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']);
end;
Просто я еще не изучал подобные функции, возможно потому написал столь громоздкую программу.

Если не затруднит, можете написать комментарии к вашему коду?

Upd:
Все, понял.
Когда программа доходит до
Код:
if check(s) then
Она выполняет проверку, обращаясь к функции:
Код:
function check(s: string): boolean;
begin
  check := (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']);
end;
И если все это проходит проверку, программа проверяет возможность хода:
Код:
if sqr(ord(s[1]) - ord(s[4])) + sqr(ord(s[2]) - ord(s[5])) = 5 then
...
Вот эта строчка мне непонятна.

Ps: голова кипит уже =D

Последний раз редактировалось Ghost3; 28.10.2012 в 21:34.
Ghost3 вне форума Ответить с цитированием
Старый 28.10.2012, 21:41   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
if sqr(ord(s[1]) - ord(s[4])) + sqr(ord(s[2]) - ord(s[5])) = 5 then
Пусть, входные данные: C7-D5
Тогда s[1] = 'C', а ord(s[1]) - код символа
ord(s[1]) - ord(s[4]) - разница по одной координате
другая разность - разница по другой координате
Чтобы ход был правильным, расстояние до клетки должно быть корень из 5. (опускаю извлечение корня с обеих сторон равенства)
Ну вот и вся проверка.

Код:
function check(s: string): boolean;
begin
  check := (length(s) = 5) and
  (s[1] in ['A'..'H'])...
Длина строки равна 5 и 1 буква принадлежит множеству {A, B, C, D, E, F, G, H} и т.д.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 28.10.2012 в 21:43.
BDA вне форума Ответить с цитированием
Старый 28.10.2012, 21:49   #7
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Чтобы ход был правильным, расстояние до клетки должно быть корень из 5.
А почему? Можете объяснить?

Upd:
Проверяю программу свою - вроде бы все верно, на "C7-D5" отвечает "YES", на "E2-E4" - "NO", на любое некорректную запись - "ERROR".

Хм, но вот на "C7-D5aasaa" отвечает "YES"... надо исправить. А нет, там написано "пользователь не может вести строку длиннее 5 символов"

Последний раз редактировалось Ghost3; 28.10.2012 в 21:59.
Ghost3 вне форума Ответить с цитированием
Старый 28.10.2012, 22:29   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию


Зеленая клетка - исходная
Желтая - куда делаем ход
Коричневые - правильные
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.10.2012, 22:34   #9
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Ага! Ясно! Спасибо вам большое!
Ghost3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Pascal ABC строки - программа, которая каждую встреченную букву "б" заменяет сочетанием "ку" (использовать модули) Raigo Помощь студентам 6 17.05.2012 15:35
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04