Приложил пример работы программы и добавил комментарии к коду.
Листинг:
from random import randint
n = randint(4, 6)
x = 0 # текущие номер элемента х
y = 0 # текущие номер элемента у
d = 0 # Направление перемещения 0 - вправо, 1 - вниз, 2 - влево, 3 - вверх
curr = 1 # номер элемента по порядку
c = n # размер цепочки
arr = [[0 for i in range(n)] for j in range(n)]
print(f"Размерность массива: {n}x{n}")
for i in range(n * n):
if d == 0:
arr[x][y] = curr
y += 1
curr += 1
if y == c:
y -= 1
d = 1
x += 1
continue
if d == 1:
arr[x][y] = curr
x += 1
curr += 1
if x == c:
x -= 1
d = 2
y -= 1
continue
if d == 2:
arr[x][y] = curr
y -= 1
curr += 1
if y == n - c - 1:
y += 1
d = 3
x -= 1
continue
if d == 3:
arr[x][y] = curr
x -= 1
curr += 1
if x == n - c:
x += 1
y += 1
d = 0
c -= 1
continue
print("Заполненный массив:")
for i in arr:
print(*i)
Вот для сравнения решение на Паскале. Я тоже использовал стек, чтобы проще было сравнивать)))
// PascalABC.NET 3.2, сборка 1370 от 24.12.2016
// Внимание! Если программа не работает, обновите версию!
function IsGood(s:string):Boolean;
begin
var St:=new Stack<char>;
foreach var c in s do
case c of
'(':St.Push(c);
')':if St.Count>0 then St.Pop
else begin Result:=false; Exit end;
end;
Result:=St.Count=0
end;
begin
var n:=ReadlnInteger('N=');
var s:=ReadArrString(n);
s.Select(x->IsGood(x)).Select(x->x?'Good':'Bad').Println(NewLine)
end.
Контрольный пример (скобки "разбавлены" числами, чтобы было ясно, что программа не только скобки умеет читать, но и проверять их расстановку в произвольной строке)
N= 4
12(3)456(7)8
123((67)8)
12)34(5
(1(234)567
Good
Good
Bad
Bad