Другие языки программирования и технологии

Кубик рубик турбопаскаль

Пожалуйста, помогите написать программу турбопаскаль которая выводит обьемный кубикрубик, через floodfill
Чтобы написать программу турбопаскаль, которая выводит объемный кубик-рубик через floodfill, нужно выполнить следующие шаги:

Создать двумерный массив, представляющий кубик-рубик. Заполнить его значениями 0 и 1, где 1 - это занятая клетка, а 0 - свободная.

Выбрать любую точку внутри кубика и запустить алгоритм floodfill, который пометит все свободные клетки вокруг выбранной точки значением 2.

Посчитать количество клеток, помеченных значением 2, и умножить его на объем одной клетки.

Вывести полученный результат.

Ниже приведен пример кода на турбопаскале, который реализует описанный алгоритм:


 const N = 10; // размер кубика-рубика 

var cube: array[1..N, 1..N, 1..N] of integer;
var start_x, start_y, start_z: integer; // начальные координаты для floodfill
var volume: integer; // объем кубика-рубика

procedure floodfill(x, y, z: integer);
begin
if (x < 1) or (x > N) or
(y < 1) or (y > N) or
(z < 1) or (z > N) or
(cube[x, y, z] 0) then // проверяем границы и свободность клетки
exit;
cube[x, y, z] := 2; // помечаем клетку
floodfill(x + 1, y, z);
floodfill(x - 1, y, z);
floodfill(x, y + 1, z);
floodfill(x, y - 1, z);
floodfill(x, y, z + 1);
floodfill(x, y, z - 1);
end;

begin
// инициализация кубика-рубика
// ...

// выбираем начальную точку для floodfill
start_x := 5;
start_y := 5;
start_z := 5;

// запускаем floodfill
floodfill(start_x, start_y, start_z);

// считаем объем кубика-рубика
volume := 0;
for x := 1 to N do
for y := 1 to N do
for z := 1 to N do
if cube[x, y, z] = 2 then
volume := volume + 1;

volume := volume * 1; // умножаем на объем одной клетки

writeln('Объем кубика-рубика: ', volume);
end.

Код написан на основе предположения, что кубик-рубик представлен трехмерным массивом.
Дима Кузнецов
Дима Кузнецов
1 465
Лучший ответ
Ниже приведен код на турбо Паскале, который выполняет заполнение кубика-рубика (3x3x3) с помощью алгоритма floodfill:

```pascal
program RubiksCube;

type
TPoint = record
X,Y,Z: Integer;
end;

var
Cube: array[1..3,1..3,1..3] of Integer;
StartPoint: TPoint;

procedure FloodFill(Point: TPoint; FillValue: Integer);
begin
if (Point.X < 1) or (Point.X > 3) or
(Point.Y < 1) or (Point.Y > 3) or
(Point.Z < 1) or (Point.Z > 3) then
Exit;

if Cube[Point.X, Point.Y, Point.Z] = FillValue then
Exit;

Cube[Point.X, Point.Y, Point.Z] := FillValue;

FloodFill(Point.X-1, Point.Y, Point.Z, FillValue);
FloodFill(Point.X+1, Point.Y, Point.Z, FillValue);
FloodFill(Point.X, Point.Y-1, Point.Z, FillValue);
FloodFill(Point.X, Point.Y+1, Point.Z, FillValue);
FloodFill(Point.X, Point.Y, Point.Z-1, FillValue);
FloodFill(Point.X, Point.Y, Point.Z+1, FillValue);
end;

procedure PrintCube;
var
X,Y,Z: Integer;
begin
for Y := 3 downto 1 do
begin
for Z := 1 to 3 do
begin
for X := 1 to 3 do
Write(Cube[X,Y,Z], ' ');
Write(' ');
end;
Writeln;
end;
end;

begin
// инициализация кубика
for StartPoint.X := 1 to 3 do
for StartPoint.Y := 1 to 3 do
for StartPoint.Z := 1 to 3 do
Cube[StartPoint.X, StartPoint.Y, StartPoint.Z] :=
(StartPoint.X - 1) * 9 + (StartPoint.Y - 1) * 3 + StartPoint.Z;

// вывод начального состояния кубика
Writeln('Initial state:');
PrintCube;

// запуск floodfill из центральной ячейки (2,2,2)
StartPoint.X := 2;
StartPoint.Y := 2;
StartPoint.Z := 2;
Writeln('Filling cube from (', StartPoint.X,',', StartPoint.Y,',', StartPoint.Z,')');
FloodFill(StartPoint, 0);

// вывод результата
Writeln('Result:');
PrintCube;
end.
```

В этом примере вспомогательная процедура `FloodFill` рекурсивно проходит по всем смежным ячейкам, заполняя их указанным значением, если они не были заполнены ранее. Начальное значение ячеек указывается при инициализации кубика. Чтобы запустить алгоритм, достаточно вызвать `FloodFill` из центральной ячейки (2,2,2), а затем вывести результат.

Обратите внимание, что в этом примере значения ячеек кубика задаются целыми числами от 1 до 27 (3x3x3). Если вы хотите использовать другие значения ячеек, измените соответствующую выражению инициализации кубика.
Андрей Пегашев
Андрей Пегашев
14 368