Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
39 / 2 / 3
Регистрация: 16.11.2015
Сообщений: 103
1

Найдите способ переставить коней в заданные клетки за наименьшее количество ходов

21.01.2016, 00:13. Показов 1780. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На шахматной доске стоят два коня, также заданы две клетки, в которые необходимо переставить этих коней. Найдите способ переставить коней в заданные клетки за наименьшее количество ходов. Кони ходят по шахматным правилам, порядок ходов не важен, конь не может становиться на клетку, если она занята другим конем

Решил сначала сделать для 1 коня и без нахождения наименьшего кол-ва ходов

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
program h;
var a:array[1..8,1..8] of integer=((0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0));
 u,q,y1,x1,x:integer;
 
procedure kn(y,x:integer);
begin
 
if q=5 then exit;
if a[y,x]=2 then begin q:=5;exit end;
 if (a[y,x]<>1)  then a[y,x]:=1
  else begin
  a[y,x]:=0; exit
        end;
 
if (y<8) and (x<7) then kn(y+1,x+2);
if (y>1) and (x<7) then kn(y-1,x+2);
if (y<7) and (x<8) then kn(y+2,x+1);
if (y<7) and (x>1) then kn(y+2,x-1);
if (y<8) and (x>2) then kn(y+1,x-2);
if (y>1) and (x>2) then kn(y-1,x-2);
if (y>2) and (x<8) then kn(y-2,x+1);
if (y>2) and (x>1) then kn(y-2,x-1);
 
end;
begin
 y1:=7;
 x1:=3;
a[y1,x1]:=3;
a[2,7]:=2;
kn(7,3);
 q:=1;
 a[y1,x1]:=3;
 for u:=1 to 8 do begin
 writeln;
 for x:=1 to 8 do
 write(a[u,x],' ');
    end;
readln
end.
Но происходит переполнение стека ,как можно исправить ?


Добавлено через 23 минуты
Переполнение исправил.В итоге получается кроме самих точек "дороги" в конечную точку есть точки которые к ней не относятся ,какое условие добавить что бы они не печатались ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2016, 00:13
Ответы с готовыми решениями:

Необходимо поменять 2 этих коней местами за наименьшее кол-во ходов.
На стандартной шахматной доске 8*8 стоят 2 шахматных коня. Необходимо поменять 2 этих коней местами...

Найти наименьшее количество ходов, которое должен сделать (p,q) конь
Здравствуйте, наткнулся на такую вот задачу (недавно начал решать олимп задачи) Васе надоело...

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

Определите, какое наименьшее количество разрешенных ходов нужно выполнить
Игровое поле представляет собой последовательность из N колонок по Ki фишек в каждой. За один ход с...

3
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
21.01.2016, 20:49 2
А можно увидеть детализацию вопроса? Да и исправленную программу?

Добавлено через 3 минуты
Да и почему не реализуете BFS=волновой алгоритм с модификацией другого перемещения?
0
39 / 2 / 3
Регистрация: 16.11.2015
Сообщений: 103
21.01.2016, 23:37  [ТС] 3
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
var a:array[1..8,1..8] of integer=((0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0),
                                   (0,0,0,0,0,0,0,0));
 u,q,y1,x1,x:integer;
 
procedure kn(y,x:integer);
begin
 
if q=5 then exit;
if a[y,x]=2 then begin q:=5;exit end;
 if (a[y,x]<>1)  then a[y,x]:=1
  else begin
  a[y,x]:=0; exit
        end;
 
if (y<8) and (x<7) then kn(y+1,x+2);
if (y>1) and (x<7) then kn(y-1,x+2);
if (y<7) and (x<8) then kn(y+2,x+1);
if (y<7) and (x>1) then kn(y+2,x-1);
if (y<8) and (x>2) then kn(y+1,x-2);
if (y>1) and (x>2) then kn(y-1,x-2);
if (y>2) and (x<8) then kn(y-2,x+1);
if (y>2) and (x>1) then kn(y-2,x-1);
 
end;
begin
 y1:=7;
 x1:=3;
a[y1,x1]:=3;
a[2,7]:=2;
kn(7,3);
 q:=1;
 a[y1,x1]:=3;
 for u:=1 to 8 do begin
 writeln;
 for x:=1 to 8 do
 write(a[u,x],' ');
    end;
readln
end.
Добавлено через 33 секунды
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Да и почему не реализуете BFS=волновой алгоритм с модификацией другого перемещения?
Хочу с рекурсией потренероваться
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
22.01.2016, 20:57 4
Коряво-коряво:
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
program Test;
 
const
  Dx: array[1..8] of integer = (1, 2, 2, 1, -1, -2, -2, -1);
  Dy: array[1..8] of integer = (2, 1, -1, -2, -2, -1, 1, 2);
var
  a: array[1..8, 1..8] of integer = 
   ((0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0),
    (0, 0, 0, 0, 0, 0, 0, 0));
var
  Xfin, Yfin: integer;
 
  function kn(y, x, Depth: integer): boolean;
  var
    i, j: integer;
  begin
    if (x < 1) or (x > 8) or (y < 1) or (y > 8) then
    begin
      kn := False;
      exit;
    end;
    if a[y, x] <> 0 then
    begin
      kn := False;
      exit;
    end;
    if (x = Xfin) and (y = Yfin) then
    begin
      for i := 1 to 8 do
        for j := 1 to 8 do
          a[i, j] := 0;
      a[Yfin, Xfin] := Depth;
      kn := True;
      exit;
    end;
    a[y, x] := Depth;
    for i := 1 to 8 do
    begin
      kn := kn(y + Dy[i], x + Dx[i], Depth + 1);
      if kn then
      begin
        a[y, x] := Depth;
        break;
      end;
    end;
  end;
 
var
  Xstart, Ystart: integer;
  i, j: integer;
begin
  Xstart := 2;
  Ystart := 7;
  Xfin := 7;
  Yfin := 3;
  kn(Ystart, Xstart, 1);
  for i := 1 to 8 do
  begin
    for j := 1 to 8 do
      Write(a[i, j]: 3);
    writeln;
  end;
  writeln;
end.
Решительно рекомендую изучить алгоритм Ли (волновой) и пользоваться им. Там кода больше (за счёт реализации структур "очередь" и "стек"), но решение красивее и эффективнее.
0
22.01.2016, 20:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2016, 20:57
Помогаю со студенческими работами здесь

За какое наименьшее количество ходов Петрик сможет отгадать заданное слово?
Петрик и Маричка увлеклись игрой поле-чудес: Маричка записывает слово, состоящее из Больших...

Какое наименьшее количество ходов должен сделать конь, чтобы попасть на заданную клетку
На шахматной доске NxN в клетке (x1, y1) стоит голодный шахматный конь. Он хочет попасть в клетку...

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

Найдите наименьшее возможное количество авиалиний
В 13 регионах нужно построить 25 баз (в каждом регионе хотя бы одну базу) так, чтобы каждые две...


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

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