Площадь комнаты - Pascal
Формулировка задачи:
Требуется вычислить площадь комнаты в квадратном лабиринте. Входные данные В первой строке вводится число N – размер лабиринта (3 <= N <=10). В следующих N строках задан лабиринт (‘.’ – пустая клетка, ‘*’ – стенка). И наконец, последняя строка содержит два числа – номер строки и столбца клетки, находящейся в комнате, площадь которой необходимо вычислить. Гарантируется, что эта клетка пустая и что лабиринт окружен стенками со всех сторон. Выходные данные Требуется вывести единственное число – количество пустых клеток в данной комнате. Примеры входные данные 5 ***** **..* *.*.* *..** ***** 2 4 выходные данные 3
Решение задачи: «Площадь комнаты»
textual
Листинг программы
program Labirint;
uses
crt;
type
arr = array[1..10,1..10] of char;
procedure vyvodarr (a: arr; n: integer); // Процедура для вывода матрицы на экран.
var
i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
Write(a[i,j]:3);
end;
Writeln;
end;
Writeln;
end;
var
//a1: arr = (('*','*','*','*','*'),('*','*','.','.','*'),('*','.','*','.','*'),('*','.','.','*','*'),('*','*','*','*','*'));
a1: arr; // Переменная для хранения исходного лабиринта.
b1: arr; // Переменная для хранения промежуточных переменных при прохождении лабиринта.
k: integer; // Переменная для хранения значения количества посещенных ячеек.
i,j,ip,jp: integer; // Промежуточные переменные для организации циклов.
ibeg,jbeg: integer; // Переменные для хранения адреса начальной, заведомо пустой ячейки.
t: integer; // Промежуточная переменная для хранения числа окружающих стен.
Stop: boolean; // Промежуточная переменная для остановки работы алгоритма.
n1: integer; // Переменная для хранения размера лабиринта.
begin
Writeln('Введите размер лабиринта:');
Readln(n1);
Writeln('Введите структуру лабиринта( "*" - стена, "." - комната):');
for i:=1 to n1 do
for j:=1 to n1 do
Readln(a1[i,j]);
Readln(n1);
vyvodarr(a1,n1);
for i:=1 to n1 do
for j:=1 to n1 do
b1[i,j]:=' ';
Writeln('Введите координаты точки вхождения:');
Writeln('Номер строки:');
Readln(ibeg);
Writeln('Номер столбца:');
Readln(jbeg);
i:=ibeg;
j:=jbeg;
t:= 0;
k:= 0;
repeat
if a1[i,j+1]='*' then
begin
inc(t);
b1[i,j+1]:= 'W'; // Стена('W'- wall)
end
else
if not (b1[i,j+1] in ['D','V','W']) then
b1[i,j+1]:= 'R'; // Дорога ('R' - road)
if a1[i,j-1]='*' then
begin
inc(t);
b1[i,j-1]:= 'W';
end
else
if not (b1[i,j-1] in ['D','V','W']) then
b1[i,j-1]:= 'R';
if a1[i+1,j]='*' then
begin
inc(t);
b1[i+1,j]:= 'W';
end
else
if not (b1[i+1,j] in ['D','V','W']) then
b1[i+1,j]:= 'R';
if a1[i-1,j]='*' then
begin
inc(t);
b1[i-1,j]:= 'W';
end
else
if not (b1[i-1,j] in ['D','V','W']) then
b1[i-1,j]:= 'R';
if t = 3 then
begin
b1[i,j]:= 'D'; // Были в этой ячейке, но здесь тупик 'D' - dead end.
inc(k);
end;
t:= 0;
if (a1[i,j] = '.') and (b1[i,j] <> 'V') and (b1[i,j] <> 'D') then
begin
b1[i,j]:= 'V'; // Были в этой ячейке (v - "visit").
inc(k);
end;
stop:= true;
for ip:=1 to n1 do
for jp:=1 to n1 do
if b1[ip,jp] = 'R' then
begin
i:=ip;
j:=jp;
stop:=false;
end;
ClrScr;
writeln('"W"- wall, "R" - road, "V" - visit, "D" - dead end.');
vyvodarr(b1,n1);
Delay(1000);
until stop;
writeln('Количество свободных ячеек: ',k);
Readln;
end.