Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
JAUG
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 7
1

Местоположение слона на шахматной доске

09.01.2012, 20:23. Просмотров 1259. Ответов 5
Метки нет (Все метки)

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

думаю реализовывать проверку через 4 процедуры, каждая для своего случая расположения свободного поля и слона. Например, если свободное поле выше и правее слона, тогда процедура check_upright, и так далее. Вот набросал:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const n=6
type coord=record;
       letter: string[1];
       number: 1..8;
end;
var figures: array [1..n] of coord;
      move, bishop: coord
begin
for i:=1 to n do readln(figures[i].letter, figures[i].number);
readln(bishop.letter, bishop.number);
readln(move.letter, move.number);
if move.number > bishop.number then if ord(move.letter) > ord(bishop.letter) then check_downright else check_upright
else if ord(move.letter) > ord(bishop.letter) then check_downleft else check_upleft;
end.
теперь думаю над содержанием этих процедур. предполагаю сделать через цикл с фиксированным числом повторений, например что-то около того для check_upright:
Pascal
1
2
3
4
5
6
7
8
9
procedure check_upright (var figures: array of coord; move, bishop: coord);
var i,j,k,checkint:integer;
begin
for i:= bishop.number to move.number do
for j:=ord(bishop.letter) downto ord(move.letter) do
for k:=1 to n do
if figures[k].number= i and ord(figures[k].leter) = j then checksum=1;
if checksum=1 then writeln('да') else writeln('нет');
end.
в принципе, эта процедура будет работать, только явно меня наругают за нерациональность: чем вычислять на одной диагонали фигуры, она будет вычислять все клетки в квадрате с противоположными углами в координатах слона и свободного поля, причем n раз. можно ли как-то упростить данную процедуру? спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 20:23
Ответы с готовыми решениями:

Положение фигуры на шахматной доске
Положение фигуры на шахматной доске (8 х 8) описывается двумя числами –...

Расставить на шахматной доске 8 ферзей.
люди помогите решить пожалуйста курсовик срочно нужно(((( Расставить на...

Расположить на шахматной доске восемь ладей
Восемь ладей. Расположить на шахматной доске восемь ладей так, чтобы при этом...

Задача про зерна на шахматной доске
Задача про зерна на шахматной доске. Задача о зёрнах на шахматной доске —...

Расположите наименьшее число слонов на шахматной доске
Помогите пожалуйста. Незащищенные слоны. Расположите наименьшее число слонов...

5
Puporev
Модератор
54686 / 42104 / 29072
Регистрация: 18.05.2008
Сообщений: 99,357
09.01.2012, 21:05 2
Цитата Сообщение от JAUG Посмотреть сообщение
думаю реализовывать проверку через 4 процедуры,
Зачем? Представить доску как матрицу 8х8. Свободные поля обозначить как 0. Поля с фигурами как 1.
Если поле слона и заданное поле не на одной диагонали, что определяется как
if abs(x.sv-x.sl)<>abs(y.sv-y.sl) then write('нет')
если да, то проверяем отрезок диагонали между полем слона и заданной точкой, есть ли на нем фигуры, есть, нельзя, нету, можно.
0
JAUG
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 7
09.01.2012, 21:17  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
проверяем отрезок диагонали между полем слона и заданной точкой
а как задать направление этой диагонали? типа если правее, то через for .. to .. , а если левее, то через for .. downto .. ? или как?
0
Puporev
Модератор
54686 / 42104 / 29072
Регистрация: 18.05.2008
Сообщений: 99,357
09.01.2012, 21:21 4
Определить что выше, что ниже, присвоить значения i1,i2
потом лево и право, присвоить j1,j2.
Pascal
1
2
for i:=i1+1 to i2-1 do
for j:=j1+1 to j2-1 do
1
JAUG
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 7
09.01.2012, 21:48  [ТС] 5
Тут всплыло уточнение - надо обязательно использовать комбинированный тип данных
0
Puporev
Модератор
54686 / 42104 / 29072
Регистрация: 18.05.2008
Сообщений: 99,357
10.01.2012, 12:20 6
Вот родил такое, переделай на свои переменные и потестируй, я чуть погонял, ошибок не нашел.

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
uses crt;
type pole=record
          x,y:byte;
          f:char;
          end;
var a:array[1..64] of pole;
    b:array[1..8,1..8] of char;
    n,i,j,{кол. фигур, счетчики}
    v,g,{для ввода координат фигур}
    vs,gs,{координаты слона}
    vp,gp:byte;{координаты заданного поля}
    f:boolean; {для проверки условий}
begin
clrscr;
for i:=1 to 64 do{обнулим поле фигура}
 begin
  a[i].f:='0';
  if i mod 8=0 then{если последняя вертикаль}
   begin
    a[i].x:=8;{присвоим координату х=номер вертикали}
    a[i].y:=i div 8;{присвоим координату y=номер горизонтали}
   end
  else {не последняя}
   begin
    a[i].x:=i mod 8;
    a[i].y:=i div 8+1;
   end;
 end;
writeln('Введите координаты поля слона номер вертикали и горизонтали от 1 до 8:');
repeat
readln(vs,gs);
until(vs in [1..8])and(gs in [1..8]);
a[8*(gs-1)+vs].f:='B';{поставим в поле символ В}
writeln('Введите координаты поля для хода номер вертикали и горизонтали от 1 до 8:');
repeat
readln(vp,gp);
until(vp in [1..8])and(gp in [1..8])and((vp<>vs)or(gp<>gs));
a[8*(gp-1)+vp].f:='P';{поставим в поле символ P}
repeat
write('Количество прочих фигур от 1 до 31 n=');
readln(n);
until n in [1..31];
writeln('Введите координаты ',n,' фигур:');
for i:=1 to n do
 begin
  writeln('Номер вертикали и горизонтали от 1 до 8 фигуры ',i);
  repeat
   repeat
   readln(v,g);
   until(v in [1..8])and(g in [1..8]);
   if a[8*(g-1)+v].f<>'0' then writeln('Это поле занято, повторите ввод');
  until a[8*(g-1)+v].f='0';
  a[8*(g-1)+v].f:='1';{поставим в поле символ 1}
 end;
clrscr;
{выведем поле}
for i:=1 to 64 do
 begin
  gotoXY(2*a[i].x-1,9-a[i].y);{снизу вверх, как в шахматах}
  write(a[i].f:2);
 end;
gotoXY(1,10); {поставим курсор ниже поля}
if abs(vs-vp)<>abs(gs-gp) then writeln('Не сможет'){не на одной дмагонали}
else {на одной}
 begin
  if 8*(gs-1)+vs<8*(gp-1)+vp then{если слон в массиве раньше}
   begin
    v:=8*(gs-1)+vs;{начало проверки}
    g:=8*(gp-1)+vp;{конец}
   end
  else {если заданное прле в массиве раньше}
   begin
    g:=8*(gs-1)+vs;
    v:=8*(gp-1)+vp;
   end;
  if v=g-1 then writeln('Сможет'){если соседи по диагонали, можно не проверять}
  else
   begin
    f:=true;
    i:=v+1;{начнем проверять со следующего}
    while(i<g)and f do{до конца-1}
    {если на диагонали между слоном и полем и поле занято, нет}
    if (a[i].x-a[v].x=a[i].y-a[v].y)and(a[i].f='1') then f:=false
    else i:=i+1;{иначе дальше, дошли до конца и не занято, да}
    if f then writeln('Сможет') else writeln('Не сможет');
   end;
 end;
readln
end.
0
10.01.2012, 12:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2012, 12:20

Как нарисовать на шахматной доске фигуры шашки
Скажите как нарисовать на шахматной доске фигуры шашки, впринцыпе алгоритм...

Расставить на шахматной доске максимальное количество суперферзей
В общем надо расставить на шахматной доске максимальное количество супер...

Вывести максимальное количество ферзей, которых можно расставить на шахматной доске
Вероятно, многие из вас играли в шахматы. Поэтому вы знаете, что ферзь может...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru