Loading...
remote87 avatar remote87 121 Точки

[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(); на последния ред от кода), защото иначе ще се отпечатат всички числа на един ред.

Ето и кода на решението:

http://pastebin.com/qurH6iXX 

Дано да съм го обяснил правилно. Не претендирам за най-добро решение, но ми се стори най-логично като стъпки на действие...а и така успях да го реша :D

Дано ви помогне!

Поздрави и успех!

Тагове:
9
Programming Basics 10/09/2015 11:50:28
plamen_ivanov avatar plamen_ivanov 1 Точки

Решението ти е за обаче квадратна матрица. За правоъгълна матрица според мен не работи.

0
HristoAtanasov87 avatar HristoAtanasov87 2 Точки

2020 година все още помага!! Благодаря

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.