[HOMEWORK] Loops Problem 19** Spiral Matrix - Explained
Здравейте!
Това е май първата задача със звездичка, която решавам и видях голям зор та реших да я обясня, ако някой смята, че ще му е от полза:
1. В ексел си направете една таблица, по която да се движите ( помага много )
3. За цялото движение ползвам for цикъл, който започва от 1ца и завършва на maxRotations ( 25 ).
2. Правя си един двумерен масив с размери [5, 5], начало на ред = 0 и начало на колона = 0. В случая, понеже искам да започна да вървя надясно ( посоката на 1, 2, 3 по хоризонтала ) си правя и една променлива ( string ) със стойност "right". Тъй като масива ми е с размери 5, 5, максималната му стойност е 25, което е и променливата maxRotations.
За да се реши по моя начин, трябва да прочетете за двумерните масиви ( http://www.introprogramming.info/intro-csharp-book/read-online/glava7-masivi/#_Toc298864079 ) иначе не става. Най-общо казано: ако искаме да начертаем шахматна дъска, имаме двумерен масив [8, 8] - осем полета по хоризонтала и 8 по вертикала. В случая използвам същото.в моя случай, искам да въведа числото 5 и да направя горната таблица.
При всяко едно обхождане на цикъла правя проверка ( if цикъл ), каква е посоката като съответно започвам с "right" и заедно с това проверявам, дали не съм излязъл от масива ( col > n - 1 ), При стигнато това положение вече съм в кутийката след числото 5 ( виж картинката горе ).
Задавам следващата желана посока ( direction = "down" ), но трябва да се върнем на кутийката с числото 5. затова намалям col-- и съответно, тъй като ще имам движение на долу, увеличавам row++.
Аналогично имам още три if цикъла за всяка една посока като на всяка променям движението с row и col.
Тук е важно да се каже, че всеки един елемент на масива първоначално е 0 или представлява ето това:
При всяко преминаване на празна кутийка, я запълвам с for цикъла в началото. Но трябва да се провери, при смяна на завъртане на вътре, дали не е вече запълнена при предходното обхождане или:
когато стигнем 16, следващата кутийка по посока на движението ("up") е вече запълнена с цифрата "1". Затова на всеки ред в кода имам проверка дали е различна от 0 стойността на елемента ( matrix[row, col] != 0 - отново от темата за двумерните масиви ).
Запълването на кутийките с for цикъла ( за което споменах ) правя със следното matrix[row, col] = i; като отново с 4 if цикъла задавам посоката с row++/ row-- и col++/ col--.
4. Отпечатването на матрицата правя с два вложени for цикъла ( един за колони и един за редове ) като всеки от тях е със крайна стойност < n. За да изглежда по-добре визуално матрицата, тук правя едно форматиране ( "{0, 4}" ) като това може да се промени, както ви харесва. На мен лично с 4 надясно ми се струва най-пригледно ( 3 много сбито, 5 много разкрачено ).
ВАЖНО! След тази стъпка ( двата вложени for цикъла ) задължително трябва да има нов ред ( Console.WriteLine(); на последния ред от кода), защото иначе ще се отпечатат всички числа на един ред.
Ето и кода на решението:
Дано да съм го обяснил правилно. Не претендирам за най-добро решение, но ми се стори най-логично като стъпки на действие...а и така успях да го реша :D
Дано ви помогне!
Поздрави и успех!