Форум программистов, компьютерный форум, киберфорум
Наши страницы
Jlovenpk1
Войти
Регистрация
Восстановить пароль
Оценить эту запись

расставлено 8 ферзей или добавить ввод ферзей вручную[Pascal.ABC]

Запись от Jlovenpk1 размещена 24.05.2018 в 03:02

Дело было в 2-а часа ночи, в паблике ВК парень написал, что нужна помощь в паскале.
Надо идти спать, но интерес к задаче был выше, учитывая, что паскаль нюхал последний раз в 14 году, взялся помочь.
В онлайн компиляторе все получалось, но ABC не хотел компилировать.
Скачал.
Сделал.

Вот код:
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
program TestProject; 
uses crt, Utils; 
const Sz=100; 
var s,i,f,ms:integer; 
vert:array[1..Sz] of boolean; // проверка вертикалей 
hor:array[2..Sz] of boolean; {сумма координат клетки 1+1=2 8+8=16, 
проверка горизонталей и диагоналей, доступна или нет} 
diag:array[-7..Sz] of boolean; // в сумме с b дает проверку диагоналей 
rasst:array[1..Sz]of integer; // номера горизонталей ферзей, собственно расстановка 
vyvod:array[1..Sz,1..Sz]of char; //матрица - вывод расположения ферзей 
 
 
procedure print; // вывод результатов на экран 
var i,j,k:integer; 
begin 
s:=s+1; 
writeln('Решение номер ',s:2,' : '+Milliseconds/1000+'c'); 
ms:=Milliseconds; 
for i:=1 to f do 
for j:=1 to f do 
vyvod[i,j]:='*'; //заполним матрицу нолями 
for k:=1 to f do 
vyvod[f-rasst[k]+1,k]:='#'; //клетки с ферзями, номер по вертикали, номер по горизонтали 
for i:=1 to f do 
begin 
for j:=1 to f do 
write(vyvod[i,j],' '); 
writeln; 
end; 
ms:=round(Milliseconds)-ms; 
writeln('Время работы: '+ms); 
write('Press <Enter>'); 
readln; 
end; 
 
 
 
procedure addFerz(i:integer); //рекурсивная процедура расстановки ферзей 
var j:integer; 
begin 
for j:=1 to f do 
if (vert[j] = TRUE) and (hor[i+j] = TRUE) and (diag[i-j] = TRUE) then //если поле не бъется 
begin 
rasst[i]:=j; //займем его 
vert[j]:=false; hor[i+j]:=false; diag[i-j]:=false; //делаем битым 
if i<f then addFerz(i+1) else print; //если не последняя вертикаль, то проверяем следующую, иначе вывод 
vert[j]:=true; hor[i+j]:=true; diag[i-j]:=true;{если не получилось до конца, освобождаем поле 
возвращаемся назад, проверяем следующий вариант} 
end; 
end; 
 
 
begin 
clrscr; 
write('Число Ферзей: '); 
readln(f); 
for i:=1 to f do vert[i]:=true; //все поля свободны 
for i:=2 to f*2 do hor[i]:=true; //нет угроз ни по горизонталям, ни по вертикалям 
for i:=-f to f do diag[i]:=true; //нет угроз по диагоналям 
s:=0; 
addFerz(1); //начинаем с первой вертикали 
readln 
end.
Размещено в Без категории
Просмотров 8683 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    Цитата:
    Скачал.
    Сделал.
    Молодец.
    Запись от Usaga размещена 24.05.2018 в 07:48 Usaga вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru