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

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

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

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

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

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

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

Задача Шахматная доска
Шахматная доска – игровое поле в шахматах и ряде других стратегических настольных игр. Традиционная шахматная доска представляет собой поле 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, 21:39   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.01.2018, 22:11   #3
Новичок_2
 
Регистрация: 02.01.2018
Сообщений: 5
По умолчанию

Код:
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 вне форума Ответить с цитированием
Старый 02.01.2018, 23:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Гораздо проще можно и эффективней
Код:
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.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

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

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

Есл решение от Аватара не проходит, то, возможно, перечисленные клетки - не занятые и не блокируют проход ферзя. Тогда нужно просто убрать проверку
Код:
    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, 07:58   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

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

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


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

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

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


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