Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 06.05.2014
Сообщений: 32

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

17.11.2014, 18:40. Показов 3830. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Расставить на шахматной доске 8 ферзей так, чтобы не один не попадал под удар. Вывести все комбинации.
помогите плиз на языке паскаль.

Добавлено через 21 минуту
Используя графический модуль.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.11.2014, 18:40
Ответы с готовыми решениями:

Расставить на стандартной 64-клеточной доске 8 ферзей так, чтобы ни один из них не находился под боем другого
Расставить на стандартной 64-клеточной доске 8 ферзей так, чтобы ни один из них не находился под боем другого (горизонтали, вертикали и...

Расставить на доске максимальное число ферзей так, чтобы каждый из них нападал ровно на р ферзей
3. Расставить на доске N×N максимальное число ферзей так, чтобы каждый из них нападал ровно на р (р<=2) ферзей. Совсем не...

Расставить на доске N ферзей так, чтобы наибольшее число ее полей оказалось вне боя ферзей
1.Расставить на доске N×N (N<=12) N ферзей так, чтобы наибольшее число ее полей оказалось вне боя ферзей. Ферзи при этом могут «бить» друг...

1
Эксперт Pascal/Delphi
2388 / 1300 / 1492
Регистрация: 29.08.2014
Сообщений: 4,665
18.11.2014, 09:59
Лучший ответ Сообщение было отмечено tolyan1247 как решение

Решение

взял отсюда: Расстановка ферзей
немного исправил, а графику сами, думаю, сможете изобразить.
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
program ferz;
type desk = array [1..8,1..8] of 0..2;
{0-пусто; 1-поле которое бьёт ферзь; 2-ферзь}
var
cur_desk : desk;   {текущий статус доски}
now_f    : byte;   {какой ферьз ставится в данный момент}
count    : byte;   {количество на доске ферзей}
variants : word;   {количество возможных вариантов}
fi,fj    : array[1..8] of byte; {координаты ферзей}
i,j      : byte;   {для расстановки первого ферзя}
iii,jjj  : byte; 
ferzes   : desk;
 
{заполнить "1" столбик и строку с номером позиции ферзя ki, kj}
 
procedure st(ki,kj:byte);
var i:integer;
begin
for i:=1 to 8 do
 begin
  if cur_desk[ki,i] <> 2 then
   cur_desk[ki,i] := 1;
  if cur_desk[i,kj] <> 2 then
   cur_desk[i,kj] := 1;
 end
end;
 
 
{заполнить "1" диагонали, которые бъёт ферзь с номером позиции ki, kj}
procedure diag(ki,kj:byte);
var i,j:integer;
begin
for i:=1 to 8 do
  for j:=1 to 8 do
   begin
    if abs(i-ki)=abs(j-kj) then
     if cur_desk[i,j]<>2 then cur_desk[i,j]:=1;
   end
end;
 
{проверяет бьют ли все 5 ферзей всё поле}
function filled : boolean;
var
i, j : integer;
fl   : boolean;
begin
fl:=true;
for i:=1 to 8 do
 for j:=1 to 8 do
  if cur_desk[i,j] = 0 then fl := false;
filled := fl
end;
 
{выводит массив ferzes, то есть правильную расстановку}
procedure print_ar;
var
i,j:integer;
begin
for i:=1 to 8 do
 begin
  for j:=1 to 8 do
   write(ferzes[i,j],' ');
  writeln
 end;
readln;
for i:=1 to 8 do for j:=1 to 8 do ferzes[i,j]:=0;
end;
 
 
{рекурсивная процедура которая расставляет ферзей
after_i,after_j переменные, которые служат для исключения повторений,
то есть поиск места для след. ферзя идёт по значениям i, j которые
идут после места только что поставленного ферзя}
 
procedure put(after_i,after_j:byte);
var
old_desk : desk;  {в ней хранится значения старой доски, чтоб при возврате из рекурсии}
                  {не терялись предыдущие значения}
iii,jjj  : byte;  
i,j      : integer;
tempk    : byte;
begin
old_desk := cur_desk;
for i:=after_i to 8 do
begin
if i=after_i then tempk:=after_j
else tempk:=1; {нужно, так как after_j исп-зя один раз когда i=after_i,}
               {ведь дальше j идёт с 1}
 for j:=tempk to 8 do
  begin
   {это условие когда не могут ббить лруг друга, то есть ферзь ставится на место,}
   {где никто его не "обидит" => если нужна возможность бить друг друга}
   {делаем условие cur_desk[i,j] <> 2, тогда будет ставится в любое место, где не}
   {стоит другой ферзь}
   if cur_desk[i,j] = 0  then
    begin
     inc(now_f);    {now_f = now ferz, то есть какого ферзя ставим}
     inc(count);    {кол-во ферзей}
     fi[now_f]:=i;  {запоминаем i,j позицию ферзя с номером now_f}
     fj[now_f]:=j;
     cur_desk[fi[now_f],fj[now_f]]:=2;  {ставим его на доску}
 
     st(fi[now_f],fj[now_f]);    {2 процедуры, описанные выше}
     diag(fi[now_f],fj[now_f]);
 
     if count <> 8 then          {если не все ферзи поставлены}
      begin
       put(i,j);
       {восстанавливает значение, когда один из проходов закончен}
       {при возврате из рекурсии}
       cur_desk := old_desk;
       fi[now_f]:=0;
       fj[now_f]:=0;
       dec(count);
       dec(now_f)
      end
     else
      begin
       {ferzes - массив, которых хранит свеженайденный расклад событий на доске}
       {использунтся чтобы выводить варианты}
       for iii:=1 to 8 do for jjj:=1 to 8 do ferzes[i,j]:=0;
       ferzes[fi[1],fj[1]] := 1;
       ferzes[fi[2],fj[2]] := 1;
       ferzes[fi[3],fj[3]] := 1;
       ferzes[fi[4],fj[4]] := 1;
       ferzes[fi[5],fj[5]] := 1;
       ferzes[fi[6],fj[6]] := 1;       
       ferzes[fi[7],fj[7]] := 1;       
       ferzes[fi[8],fj[8]] := 1;       
       {ставим 5-го ферзя и убираем его для дальнейшего его расставления,}
       {или чтобы не была мусорна 5 переменная, когда возвращаемся на расстановку}
       {4 ферзя(когда для 5 ферзя i=j=8)}
       fi[now_f]:=0;
       fj[now_f]:=0;
       dec(count);
       dec(now_f);
             if filled then
              begin
               inc(variants);
               {нашли вариант, и вывели массив если надо}
               print_ar;
               cur_desk:=old_desk;
              end
             else
              begin
               cur_desk:=old_desk;
              end
      end
 
    end
  end
end
end;
 
begin
{цикл по всей доске для выбора куда поставить самого 1 ферзя}
for i:=1 to 8 do
 for j:=1 to 8 do
  begin
   {показываю инициализацию доски для 1 ферзя}
   count := 0;
   now_f := 0;
 
       for iii:=1 to 8 do for jjj:=1 to 8 do cur_desk[i,j]:=0;
   fi[1]:=i;
   fj[1]:=j;
 
   cur_desk[fi[1],fj[1]]:=2;
   st(fi[1],fj[1]);
   diag(fi[1],fj[1]);
 
   inc(count);
   inc(now_f);
 
   put(i,j);
  end;
 write('Число вариантов: ');
 writeln(variants);
 readln
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2014, 09:59
Помогаю со студенческими работами здесь

Вывести максимальное количество ферзей, которых можно расставить на доске N*M так, чтобы они не били друг друга
Задается шахматная доска N*M Нужно вывести максимальное количество Ферьз которых можно расставить так чтоб они не билидруг друга Формат...

Установить на шахматной доске минимум ферзей (первоначально 8), чтобы каждое поле было под боем
Доска (8*8). Требуется, чтобы программа выводила первоначально матрицу с 8-ью ферзями, затем с 7-ью и так уменьшала количество ферзей до...

Расставить на стандартной 64-клеточной шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого
Добрый день! Мне очень нужна ваша помощь. У меня есть формулаx===x || y===y || Math.abs(x-x)===Math.abs(y-y), понимаю суть, что берем...

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

Расставить 8 ферзей на шахматной доске так, чтобы они не били друг друга
В коде какая-то ошибка поправьте пожалуйста unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru