В зависимости от введённого параметра, разбиение будет идти на столько же частей сколько указано. Всё работает в алгоритме(если что, то это черновой вариант, оптимизировать можно всегда), но иногда происходят странные явления в проверочном выводе множества. Оно показывает порой, что элементов множество не столько сколько заданно в вызове функции, а на один меньше. Никак не могу найти где этот баг засел и как его исправить.
- Код: Выделить всё
- 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;
Вот так я её решил.



