Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 02.01.2018, 22:37   #1
Новичок_2
 
Регистрация: 02.01.2018
Сообщений: 5
Репутация: 10
По умолчанию Задача Шахматная доска

Не могу найти способ решения задачи " Шахматная доска" Подскажите, как ее решать.

Задача Шахматная доска
Шахматная доска – игровое поле в шахматах и ряде других стратегических настольных игр. Традиционная шахматная доска представляет собой поле 8*8 (всего 64) темных и светлых клеток (полей).
Каждое поле будем задавать парой чисел i и j – это клетка на пересечении I – й строки и j – ого столбца. Таким образом, нижний левый угол – это поле с координатами (1,1) – темная клетка, а правый верхний угол – это поле с координатами (8,8 ) – также темная клетка.
Ферзь – самая сильная шахматная фигура. В современных шахматах ферзь может перемещаться на любое число полей по вертикали, горизонтали и диагонали, объединяя возможности ладьи и слона (при условии, что на его пути нет фигур).
Находясь на одном из центральных полей, ферзь может атаковать до 27 полей одновременно!.
Ваша задача по координатам клеток определить, на какие из них ферзь из заданной позиции может попасть за один ход.
Формат входных данных
В каждой из пяти строк входного файла input.txt записана пара чисел i и j координаты клеток. В шестой строке записана пара чисел – координаты ферзя.
Формат выходных данных
В единственную строку выходного файла output.txt выведите координаты клеток на которые ферзь может попасть за один ход. Клетки выводятся в том порядке, в каком они встречаются во входном файле.
Примеры

Input.txt
7 2
2 1
3 2
5 3
7 8
5 4

Qutput.txt
7 2 3 2 5 3
Новичок_2 вне форума   Ответить с цитированием
Старый 02.01.2018, 22:39   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 15,829
Репутация: 3110

icq: 512-765
skype: alexp.frl
По умолчанию

Тут не решатель задач.

Покажите свои наработки, конкретные вопросы и т.п.
http://www.programmersforum.ru/announcement.php?f=31

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Alex11223 на форуме   Ответить с цитированием
Старый 02.01.2018, 23:11   #3
Новичок_2
 
Регистрация: 02.01.2018
Сообщений: 5
Репутация: 10
По умолчанию

Код:

var c:array[1..5,1..5] of byte;
a:array[1..100,1..100] of byte;
 d:array[1..5] of byte;
n,i,m,j,k,x,y:integer;
begin
end;
begin
  for  i:=1 to 8 do 
    for  j:=1 to 8 do 
     a[i,j]:=0;     
   for k:=1 to 5 do begin  
      read(i,j);
      a[i,j]:=1;
      d[k]:=i*10+j;
   end;
read(x,y);
  c[x,y]:=1;      
 for k:=1 to 5 do begin
 n:=d[k] div 10; m:=d[k] mod 10;
 // главная диагональ//
     for i:=x+1 to 8 do begin  
          j:=y-1;
          if c[x,y]=a[n,m] then write(n,' ',m,' '); break;
          end;
      for i:=x-1 downto 1 do begin  
          j:=y+1;
          if c[x,y]=a[n,m]then write(n,' ',m,' ');break;
          end; 
   // побочная диагональ// 
      for i:=x+1 to 8 do begin
          j:=y+1;
          if c[x,y]=a[n,m]then write(n,' ',m,' ');break;
          end;
      for i:=x-1 downto 1 do begin  
          j:=y-1;
          if c[x,y]=a[n,m]then write(n,' ',m,' ');break;
          end;
  // влево//
       for j:=y-1 downto 1 do begin  
          i:=x;
          if c[x,y]=a[n,m]then write(n,' ',m,' ');break;
          end;
  // вправо//
      for j:=y+1 to 8 do begin  
          i:=x;
          if c[x,y]=a[n,m]then write(n,' ', m,' ');break;
          end;
  // вверх//
      for i:=x+1 to 8 do begin  
          j:=y;
          if c[x,y]=a[n,m]then write(n,' ',m, ' );break;
          end;
   // вниз//
       for i:=x-1 downto 1 do begin  
          j:=y;
          if c[x,y]=a[n,m]then write(n,' ', m,' ' );break;
          end;
    end;
end.

Новичок_2 вне форума   Ответить с цитированием
Старый 03.01.2018, 00:40   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,364
Репутация: 6052
По умолчанию

Гораздо проще можно и эффективней
Код:

uses Math;

const n = 5;
type TMyRecor = record
       x,y: Smallint;
       b: Boolean;
     end;
var t: Text;
    m: array[1..n] of TMyRecor;
    i,j: Integer;
    x,y: Smallint;

begin
  //чтение
  Assign(t,'input.txt');
  Reset(t);
  for i:=1 to n do Readln(t,m[i].x,m[i].y);
  Readln(t,x,y);
  Close(t);
  //расчет
  for i:=1 to n do begin
    m[i].b:=(m[i].x=x) or (m[i].y=y) or (Abs(m[i].x-x)=Abs(m[i].y-y)); //True - на линии боя
    if m[i].b then
      for j:=1 to i-1 do
        if m[j].b and (Sign(m[i].x-x)=Sign(m[j].x-x)) and (Sign(m[i].y-y)=Sign(m[j].y-y)) then begin
          if (Abs(m[i].x-x)<Abs(m[j].x-x)) or (Abs(m[i].y-y)<Abs(m[j].y-y)) then m[j].b:=False else m[i].b:=False;
          Break;
        end;
  end;
  //результат
  Assign(t,'output.txt');
  Rewrite(t);
  for i:=1 to n do if m[i].b then write(t,m[i].x,' ',m[i].y,' ');
  Close(t);
end.

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.01.2018 в 00:52.
Аватар вне форума   Ответить с цитированием
Старый 04.01.2018, 00:12   #5
Новичок_2
 
Регистрация: 02.01.2018
Сообщений: 5
Репутация: 10
По умолчанию Задача Шахматная доска

Спасибо, Ваш код действительно проще и эффективнее, но проходит также половину тестов
Новичок_2 вне форума   Ответить с цитированием
Старый 04.01.2018, 02:47   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 783
Репутация: 570
По умолчанию

Есл решение от Аватара не проходит, то, возможно, перечисленные клетки - не занятые и не блокируют проход ферзя. Тогда нужно просто убрать проверку
Код:

    if m[i].b then
      for j:=1 to i-1 do
        if m[j].b and (Sign(m[i].x-x)=Sign(m[j].x-x)) and (Sign(m[i].y-y)=Sign(m[j].y-y)) then begin
          if (Abs(m[i].x-x)<Abs(m[j].x-x)) or (Abs(m[i].y-y)<Abs(m[j].y-y)) then m[j].b:=False else m[i].b:=False;
          Break;
        end;

Ещё возможны игры с клеткой, на которой ферзь стоит изначально.
Black Fregat вне форума   Ответить с цитированием
Старый 04.01.2018, 08:58   #7
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,364
Репутация: 6052
По умолчанию

Если на входе будут повторяющиеся координаты, то порядок вывода будет не правильный. Попробуй учесть это
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 04.01.2018, 12:20   #8
Новичок_2
 
Регистрация: 02.01.2018
Сообщений: 5
Репутация: 10
По умолчанию

Спасибо. Подсказку проверяю.
Новичок_2 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шахматная доска xamelion Visual C++ 8 15.02.2012 21:41
шахматная доска revaldo666 Общие вопросы C/C++ 4 11.01.2011 12:25
Шахматная доска!!! Евгений19 Помощь студентам 3 08.03.2010 21:02
Шахматная доска Shevali Помощь студентам 4 03.04.2009 20:22
шахматная доска Irisha_17_85 Паскаль 4 04.11.2008 11:50


18:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru