Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 101
1

Определить, возможно ли попасть из одной клетки в другую одним ходом шахматного коня

15.04.2012, 21:24. Показов 8302. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Заданы две клетки шахматной доски. Требуется определить, возможно ли попасть из одной клетки в другую одним ходом шахматного коня, а если нет, то следует выяснить, возможно ли попасть с помощью двух ходов.
Входные данные

Входной файл INPUT.TXT содержит координаты двух клеток в общепринятом формате: каждая координата записывается как латинская строчная буква и цифра, координаты отделены друг от друга запятой и пробелом.
Выходные данные

Выходной файл OUTPUT.TXT должен содержать цифру «1», если возможно из одной клетки в другую попасть за 1 ход, либо цифру «2», если попасть можно за 2 хода, либо «NO», если одна клетка недостижима из другой ни за 1 ни за 2 хода.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2012, 21:24
Ответы с готовыми решениями:

Определить, сможет ли шахматный слон попасть с одной клетки на другую одним ходом
В общем,задача звучит так: шахматный слон ходит по диагонали. Ввести с клавиатуры 2 разные клетки...

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

Если возможно, с поля (k, l) одним ходом коня попасть на поле (m, n)
Поле шахматной доски определяется парой натуральных чисел, первое из которых задает номер...

Проверить можно ли ходом короля из одной клетки попасть в другую
Делать было нечего решил все простые задачи перерешать с сайта. Ближе к делу: Поле шахматной доски...

12
133 / 132 / 60
Регистрация: 10.12.2008
Сообщений: 286
19.04.2012, 17:33 2
Алгоритм следующий:
Имеется шахматная доска (матрица 8х8). Она заполняется 0, первая ячейка -1, искомая ячейка -2. (См. рис. 1). Далее на первом проходе анализируем все возможные ходы из первой ячейки и помечаем их величиной текущего прохода, т.е. 1 (См. рис. 2). Затем уже анализируются эти помеченные ячейки с 1 на возможные ходы из них. Эти возможные ходы уже помечаются 2 (См. рис. 2) и т.д. пока не окажется, что ячейка, в которую собираются ходить, является искомой.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
const
  NOT_VIEW =  0;  {Ячейка не просматривалась}
  FIRST    = -1;  {Первая ячейка}
  SEARCH   = -2;  {Искомая ячейка}
 
type
  TCell = record
    i: integer;
    j: integer;
  end;
  TDesk = array [1..8,1..8] of integer;
 
var
  f: text;
  s: string[6];
  cellOne: TCell;
  cellTwo: TCell;
  desk   : TDesk;
  amtRun: integer;
 
{Обнуление доски}
procedure FillNullDesk;
var
  i,j: integer;
begin
  for i := 1 to 8 do
    for j := 1 to 8 do
      desk[i][j] := NOT_VIEW;
end;
 
{Сохранение результатов в файл}
procedure SaveToFile(fName: string);
var
  f: text;
begin
  assign(f,fName);
  {$I-}reset(f);{$I+}
  if (IOResult <> 0) then rewrite(f);
  append(f);
  if (amtRun = 0) then
    writeln(f,'NO')
  else
    writeln(f,amtRun);
  close(f);
end;
 
{Вывод доски на экран}
procedure PrintDesk;
var
  i,j: integer;
begin
  write('  ');
  for i := 1 to 8 do
    write(chr(i+96):3);
  writeln;writeln;
  for i := 1 to 8 do begin
    write(i,' ');
    for j := 1 to 8 do
      write(desk[i][j]:3);
    writeln;
  end;
  writeln;
end;
 
{Возможен ли ход из данной ячейки}
function IsGoodRun(x,y: integer): boolean;
begin
  IsGoodRun := false;
  if (x <> cellOne.i) and (y <> cellOne.j) and
     ((desk[x][y] = NOT_VIEW) or (desk[x][y] = SEARCH)) then begin
    if (((cellOne.i mod 2) = 1) and ((cellOne.j mod 2) = 1)) or
       (((cellOne.i mod 2) = 0) and ((cellOne.j mod 2) = 0)) then begin
      IsGoodRun := (((x mod 2) = 0) and ((y mod 2) = 1)) or
                   (((x mod 2) = 1) and ((y mod 2) = 0))
    end;
    if (((cellOne.i mod 2) = 1) and ((cellOne.j mod 2) = 0)) or
       (((cellOne.i mod 2) = 0) and ((cellOne.j mod 2) = 1)) then begin
      IsGoodRun := (((x mod 2) = 0) and ((y mod 2) = 0)) or
                   (((x mod 2) = 1) and ((y mod 2) = 1));
    end;
  end;
end;
 
{Вычисляем границы возможного хода}
procedure CalcBegEnd(value: integer; var begInd,endInd: integer);
begin
  if ((value-2) < 1) then begInd := 1 else begInd := value-2;
  if ((value+2) > 8) then endInd := 8 else endInd := value+2;
end;
 
{Проверить все возможные ходы из ячейки}
function CheckGoodRun(amtRun: integer): boolean;
var
  bGood: boolean;
  i,j  : integer;
  begI,endI: integer;
  begJ,endJ: integer; 
begin
  CheckGoodRun := false;
  CalcBegEnd(cellOne.i,begI,endI);
  CalcBegEnd(cellOne.j,begJ,endJ);
  for i := begI to endI do
    for j := begJ to endJ do
      if IsGoodRun(i,j) then begin
        if (desk[i][j] = SEARCH) then begin
          CheckGoodRun := true;
          exit;
        end;
        desk[i][j] := amtRun+1;
      end;
  PrintDesk;
end;
 
{Поиск хода до второй ячейки}
procedure SearchRun(var amtRun: integer);
var
  i,j: integer;
begin
  if (desk[cellOne.i][cellOne.j] = SEARCH) then exit;
  for i := 1 to 8 do
    for j := 1 to 8 do
      if ((amtRun = 0) and (desk[i][j] = FIRST)) or
         ((amtRun > 0) and (desk[i][j] = amtRun)) then begin
        cellOne.i := i;
        cellOne.j := j;
        if CheckGoodRun(amtRun) then begin
          inc(amtRun);
          exit;
        end;
      end;
  inc(amtRun);
  SearchRun(amtRun);
end;
 
begin
  assign(f,'input.txt');
  reset(f);
  while (not EoF(f)) do begin
    readln(f,s);
    cellOne.i := ord(s[1])-96;
    cellOne.j := ord(s[2])-48;
    cellTwo.i := ord(s[5])-96;
    cellTwo.j := ord(s[6])-48;
 
    amtRun := 0;
    FillNullDesk;
    desk[cellOne.j][cellOne.i] := FIRST;
    desk[cellTwo.j][cellTwo.i] := SEARCH;
    PrintDesk;
    SearchRun(amtRun);
 
    SaveToFile('output.txt');
  end;
  close(f);
end.
Изображения
   
0
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 101
19.04.2012, 18:29  [ТС] 3
спасибо большое!
0
3 / 3 / 6
Регистрация: 24.03.2014
Сообщений: 65
23.07.2014, 15:09 4
Вот моя версия 1533 байт.
Наверняка можно лучше. Но у меня пропало желание её улучшать, как только я её сдал.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
var s:string;
    a,b,c,d:word;
function e(a,b,m:word):word;  
 begin    
{Функция проверяет каждый из 8ми случаев, если случай возможен, но начальные координаты и конечные не равны, то она вызывает эту же функцию еще раз, чтобы проверить на второй ход (см. ниже)}
  e:=0;
  if (b<7) and (a>1) then if (a-1=c) and (b+2=d) then
     begin
     if m=0  then begin e:=1; exit; end else begin e:=2; exit; end; 
{m - это номер проверки - 0 значит первая, 1 значит вторая. Если координаты равны при первой проверке - функция становится равна 1 - выход. Если при второй проверке - функция равна 2 - выход}
     end
     else
      begin
        if m=0 then   e:=e(a-1,b+2,1);
        if result=2 then exit;
      end;
  if (b<7) and (a<8) then if (a+1=c) and (b+2=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
     begin
      if m=0 then  e:=e(a+1,b+2,1);
      if result=2 then exit;
      end;
  if (b<8) and (a>2) then if (a-2=c) and (b+1=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
      begin
      if m=0 then  e:=e(a-2,b+1,1);  
      if result=2 then exit;
      end;
  if (b>1) and (a>2) then if (a-2=c) and (b-1=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
     begin
      if m=0 then  e:=e(a-2,b-1,1);  
      if result=2 then exit;
      end;
   if (b>2) and (a>1) then if (a-1=c) and (b-2=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
      begin
       if m=0 then  e:=e(a-1,b-2,1);  
       if result=2 then exit;
      end;
   if (b>2) and (a<8) then if (a+1=c) and (b-2=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
      begin
       if m=0 then e:=e(a+1,b-2,1);  
       if result=2 then exit;
      end;
   if (b<8) and (a<7) then if (a+2=c) and (b+1=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
     begin
      if m=0 then e:=e(a+2,b+1,1);  
      if result=2 then exit;
     end;
   if (b>1) and (a<7) then if (a+2=c) and (b-1=d) then
     begin
     if m=0 then begin e:=1; exit; end else begin e:=2; exit; end;
     end
     else
     begin
     if m=0 then e:=e(a+2,b-1,1);  
     if result=2 then exit;
      end;
     end;
              
begin
assign(input, 'input.txt'); reset(input); 
assign(output, 'output.txt'); rewrite(output);
read(s); 
a:=ord(s[1])-96; b:=ord(s[2])-48; c:=ord(s[5])-96; d:=ord(s[6])-48; {Превращает буквы в цифры от 1 до 8. Ну и цифры тоже}
if e(a,b,0)=0 then write('NO') else  write(e(a,b,0));
end.
0
1647 / 1095 / 488
Регистрация: 17.07.2012
Сообщений: 5,356
27.07.2014, 16:19 5
CrazzyBeer, на дату темы смотрели?! А вообще если известны координаты x1,y1 коня и x2,y2 другого поля достаточно проверить разницу координат. Должно выйти 2 и 1. И кода очень мало.
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
27.07.2014, 18:34 6
Цитата Сообщение от Новичок Посмотреть сообщение
А вообще если известны координаты x1,y1 коня и x2,y2 другого поля достаточно проверить разницу координат. Должно выйти 2 и 1. И кода очень мало.
Да ни разу.
Спорим, что из A1 можно попасть в E3? А разница не 2 и 1?..
0
1647 / 1095 / 488
Регистрация: 17.07.2012
Сообщений: 5,356
27.07.2014, 18:43 7
Ромаха, да, я не прав. Думал за один ход, а там за два...
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
28.07.2014, 12:13 8
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Var
  x0,y0,x,y : integer;
 
Function Horse(a0,b0,a,b : Integer) : Boolean;
Begin
  Horse:=((a0-2=a) and (b0+1=b)) or
         ((a0-1=a) and (b0+2=b)) or
         ((a0+1=a) and (b0+2=b)) or
         ((a0+2=a) and (b0+1=b)) or
         ((a0+2=a) and (b0-1=b)) or
         ((a0+1=a) and (b0-2=b)) or
         ((a0-1=a) and (b0-2=b)) or
         ((a0-2=a) and (b0-1=b));
end;
 
Begin
  x0:=1; y0:=1; { Readln(x0,y0); }
  x:=3; y:=5; { Readln(x,y); }
  If Horse(x0,y0,x,y) then Writeln('1')
    else
    If Horse(x0-2,y0+1,x,y) or
       Horse(x0-1,y0+2,x,y) or
       Horse(x0+1,y0+2,x,y) or
       Horse(x0+2,y0+1,x,y) or
       Horse(x0+2,y0-1,x,y) or
       Horse(x0+1,y0-2,x,y) or
       Horse(x0-1,y0-2,x,y) or
       Horse(x0-2,y0-1,x,y) then Writeln('2') else Writeln('NO');
end.
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
28.07.2014, 13:06 9
Да ни разу..
Из A1 можно попасть в G7.. У Вас же - нет.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.07.2014, 13:21 10
Цитата Сообщение от Ромаха Посмотреть сообщение
Из A1 можно попасть в G7
За 2 хода? Это как?
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
28.07.2014, 14:10 11
Цитата Сообщение от Puporev Посмотреть сообщение
За 2 хода? Это как?
Ладно.. Тут действительной мой косяк.. Не прочитал условие
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
28.07.2014, 14:10 12
Если не ограничиваться количеством ходов, то можно попасть из любой клетки в любую.
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
01.08.2014, 14:04 13
А то и дальше.
0
01.08.2014, 14:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2014, 14:04
Помогаю со студенческими работами здесь

Определить, можно ли с клетки (k, l) одним ходом ферзя попасть на клетку (m, n)
Поле для шахмат определяется парой натуральных чисел, каждое из которых не превышает восьми:...

Определить, может ли ферзь попасть с первой клетки на вторую одним ходом
Всем привет Начал изучать питон Засел на задачке про ферзя, условие такие: &quot;Шахматный ферзь...

Определить может ли конь попасть с первой клетки на вторую одним ходом?
Добрый день. Задача: Шахматный конь ходит буквой “Г” — на две клетки по вертикали в любом...

Определить, может ли ферзь попасть с первой клетки на вторую одним ходом
Решаю задание на c++. Шахматный ферзь ходит по диагонали, горизонтали или вертикали. Даны две...

Определить, может ли ладья попасть с первой клетки на вторую одним ходом
Шахматная ладья ходит по горизонтали или вертикали. Даны две различные клетки шахматной доски,...

Определить, может ли король попасть с первой заданной клетки на вторую одним ходом
Шахматный король ходит по горизонтали, вертикали и диагонали, но только на 1 клетку. Даны две...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru