В зависимости от введённого параметра, разбиение будет идти на столько же частей сколько указано. Всё работает в алгоритме(если что, то это черновой вариант, оптимизировать можно всегда), но иногда происходят странные явления в проверочном выводе множества. Оно показывает порой, что элементов множество не столько сколько заданно в вызове функции, а на один меньше. Никак не могу найти где этот баг засел и как его исправить.
- Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
i,j,coord:integer;
checked:boolean;
side_x:set of byte;
checking:array [1..10] of integer;
begin
side_x:=[];
for i:=1 to 10 do checking[i]:=0;
for i:=1 to number_of_buildings div 2 do begin
repeat
coord:=random(N-1)+1;
checked:=true;
for j:=1 to 10 do
if checking[j] = 0
then break
else if ((checking[j]+2)<coord)and((checking[j]-2)>coord)
then begin
checked:=false;
break;
end;
if checked and (not(coord in side_x))
then begin
for j:=1 to 10 do
if checking[j] = 0
then begin
checking[j]:=coord;
break;
end;
break;
end;
until true;
side_x:=side_x+[coord];
end;
for j:=1 to N do if j in side_x then writeln(j);
writeln();
end;
Добавлено спустя 19 минут 23 секунды:
Почистил код, но проблема осталась та же, при generate_chunk(2) выводит иной раз только один элемент.
- Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
i,j,coord:integer;
side_x,check_x:set of byte;
begin
side_x:=[];
check_x:=[];
for i:=1 to number_of_buildings div 2 do begin
repeat
coord:=random(N-1)+1;
if not (coord in check_x)
then begin
check_x:=check_x+[coord]+[coord-2]+[coord+2];
break;
end;
until true;
side_x:=side_x+[coord];
end;
for j:=1 to N do if j in side_x then writeln(j);
writeln();
end;
Добавлено спустя 14 минут 42 секунды:
На удивление проблему решил, но... не понял как
Если не трудно, то кто-нибудь объясните, что это было.
- Код: Выделить всё
function generate_chunk(number_of_buildings:integer):chunk;
var
i,j,coord:integer;
side_x,check_x:set of byte;
begin
side_x:=[];
check_x:=[];
for i:=1 to number_of_buildings div 2 do begin
repeat
repeat coord:=random(N-1)+1 until not(coord in check_x);
if (coord>0)
then begin
check_x:=check_x+[coord]+[coord-2]+[coord+2]+[coord-1]+[coord+1];
break;
end;
until true;
side_x:=side_x+[coord];
end;
for j:=1 to N do if j in side_x then write(j, ' ');
writeln();
end;
Вот так я её решил.