K vyřešení tohoto problému lze použít následující algoritmus:
- Inicializovat čtyři proměnné: horní hranice, dolní hranice, levá hranice a pravá hranice, které ukazují na hranice matice.
- Inicializovat proměnné: směr (počáteční směr – doprava) a čítač (počáteční hodnota je 1).
- Spustit cyklus, který bude proveden, dokud jsou hodnoty horní hranice a levé hranice menší nebo rovny spodní a pravé hranici.
- Vyveďte všechny prvky horní hranice (od levé k pravé hranici) a zvyšte hodnotu horní hranice.
- Zvětšit pult.
- Odstranit všechny prvky pravé hranice (od horní k dolní hranici) a snížit hodnotu pravé hranice.
- Zvětšit pult.
- Odstraňte všechny prvky spodní hranice (vpravo až vlevo) a snižte hodnotu spodní hranice.
- Zvětšit pult.
- Vyveďte všechny prvky levé hranice (od spodní k horní hranici) a zvyšte hodnotu levé hranice.
- Zvětšit pult.
- Opakujte kroky 4-11, dokud nebudou vyvedeny všechny prvky pole.
Pomocí tohoto algoritmu je tedy možné efektivně odvodit pole ve spirále.
Řekněme, že máme další pole:
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9
1 2 3
5
7 8 9
1 2 3
5
7 8 9
Tímto způsobem získáme hledaný spirálový tvar pole 3x3.
[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]
function printSpiral(matrix) topRow++;for (let i = topRow; i rightColumn--;if (topRow = leftColumn; i--) bottomRow--;>if (leftColumn = topRow; i--) leftColumn++;>>return result;>let matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]];let spiral = printSpiral(matrix);console.log(spiral);
V důsledku provádění tohoto kódu bude do konzole vyvedeno pole obsahující prvky zdrojového pole vyšlechtěné ve spirále:
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
Tímto způsobem jsme pomocí této funkce úspěšně vyvedli pole 4x4 ve spirále.
def print_spiral(matrix):row_start = 0row_end = len(matrix) - 1col_start = 0col_end = len(matrix[0]) - 1while row_start
V důsledku provedení tohoto příkladu bude odvozena následující posloupnost čísel: 1, 2, 3, 6, 9, 8, 7, 4, 5.