[C#] Домашно Loops - 14 задача


9

 

14.Write a program that reads a positive integer number N (N < 20) from console and outputs in the console the numbers 1 ... N numbers arranged as a spiral.

Здравейте,

Първо искам да се извиня, ако има подобна тема, но аз не успях да я открия. Преди няколко часа гледах лекцията за цикли, след което се захванах направо с последната задача. Прочетох някои неща от темата за масиви в книгата на Наков и стигнах до решение. Искам да попитам дали решението ми е правилно и ако е, как може да бъде подобрено. Всички критики и коментари са добре дошли.

http://pastebin.com/zG0DNC4a




Отговори



2

Здравей, мойто решение е почти идентично и аз си го харесвам :)) Само бих искал да допълня за принтирането на матрицата, за да има по добър вид:

 

        for (int rows = 0; rows < array.GetLength(0); rows++)
        {
            for (int cols = 0; cols < array.GetLength(1); cols++)
            {
                Console.Write("{0,4}", array[rows, cols]);
            }
            Console.WriteLine();
        }
 
Поздрави

от ivivanov (903 точки)


1

 В тази задача има противоречие между условието и примера. Първо се казва "outputs in the console the numbers 1 ... N numbers arranged as a spiral.", а после в примера е дадено N = 4, а се принтира до 16. 

В крайна сметка аз го направих така, че да принтира до N в спирала и да запазва разстоянията, за да не изглежда маймунски. Сорс - http://pastebin.com/ZZjVYwZb

 

Колкото до твоят код, виждам че N ти е страната(както е в примера), мога да ти препоръчам да изписваш "\t" след всяко число, така принтираната ти матрица ще изглежда много по-четливо.


от georgi.ivanov (3261 точки)


0
Наистина има противоречие в условието на задачата. Коректното условие е да се изведе матрица със страна N, както е в примера. В учебника на Наков на страница 238 я има същата задача.

от psabinski (129 точки)

0
Привет, много ми помогна твоя код за задачата, така че БЛАГОДАРЯ! Само имаш съвсем дребна грешка. При 5 за страна, числото в края на спиралата (25) не се изписва. Първият цикъл за генериране на матрицата трябва да включва и равно на страната: for (int i = 0; i <= n / 2; i++). Поздрави ;)

от sylviapsh (302 точки)



0
Здравейте! Ето линк към една малко по-стара тема (и доста по-неоткриваема разбира се поради липсата повечко подходящи тагове и поради неизползването на новия "стандарт" за заглавието на теми за задачи от домашните :) ). В нея също бяхме обсъждали тази задачка и съответно може да погледнете няколко други примерни решения. Линк към темата:
http://forums.academy.telerik.com/24259/%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0-%D0%BE%D1%82-%D1%86%D0%B8%D0%BA%D0%BB%D0%B8-%D1%81%D0%BF%D0%B8%D1%80%D0%B0%D0%BB%D0%BE%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE-%D0%BE%D0%BF%D1%82%D0%B5%D1%87%D0%B0%D1%82%D0%B2%D0%B0%D0%BD%D0%B5-%D0%BD%D0%B0-%D1%87%D0%B8%D1%81%D0%BB%D0%B0-%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0
Поздрави: Деян

от d_p_y (712 точки)


0
Здравейте,
И моето решение е идентично. Бих искал само да отбележа 2 неща:
- според мен няма нужда да използвате GetLength, след като в "number" имаш записана страната на матрицата - съответно размерността на масива.
- в условието пише, че N < 20, т.е. за да е изпълнено условието съм добавил и една проверка за въведеното число (1 < N < 20).
Поздрави!

от slavii (0 точки)


0

 

Здравейте,

Ето и моето решение, различно е от досега публикуваните.  http://pastebin.com/yURzgTVJ

Също така за отпечатването на матрицата съм използвал друг подход. Направил съм

го така, че да се слага различен спейсинг на двуцифрени и на едноцифрни числа. Аналогично може да се направи и за трицифрени.  


от psabinski (129 точки)


0
Когато напишеш int[,] matrix = new int[n,n], матрицата автоматично се запълва с нули.
В случая може да се получат и трицифрени числа. Защо просто не си форматираш изхода Console.Write("{0,4}", matrix[col, row])?

от gugulete (110 точки)


0

Признавам си, че доста посмислих върху вариантите за тази задача. Ето и моето решение:

http://pastebin.com/Y2SWXNik

За разлика от други решения, които видях, аз не извъртам броя на всички числа в матрицата, като вътре в цикъла да правя нови и нови проверки и цикли, а въртя само броя на смяната на посоките. Решението ми може да не е много в час, но си е изцяло мое и не дава "бъгове" в диапазоните, които тествах. В този вариант съм заделил максимум 4 символа за позиция в матрицата, което ще рече, че за пригледност числата трябва да не надвишават 3 цифри :)


от lamerko (1141 точки)


1

Аз разбирам условието, че страната е дълга N и съответно се разпечатва до N*N (N квадрат).

Ето и моето решение: 

http://pastebin.com/E0ujPhUN

Първоначално мислех да ползвам двумерен масив, да го напълня според условието и после просто да го разпечатам.

Обаче се заиграх с Console.SetCursorPosition(x,y), разширих си прозореца на конзолата за да събира колкото може по-голяма матрица и се получи мн готина. Даже се разпечатва постепенно. Абе, много съм горд! :)  

Това домашно ми беше едно от най-интересните до сега. Стават все по-хубави.

PS. След разясненията на колегата промених кода си, така че да ползвам масив 
http://pastebin.com/cXF6E9s3


от gparlakov (884 точки)


0
Нали знаеш, че този подход няма да мине на изпит, ако ти се падне нещо подобно. Въобще заиграването с конзолата не минава на изпита, понеже там няма конзола... :)

от lamerko (1141 точки)

0
Хъм - я раздуй. Аз нищо не знам за това как ще протече изпита. Иначе това ще стане и с двумерен масив- но проблемо - просто реших, че тъй като не сме "взели :)" масиви да се пробвам така.

от gparlakov (884 точки)



2
Ето и моето решение: https://github.com/jasssonpet/TelerikAcademy/blob/master/Programming/1.CSharpPartOne/6.Loops/14.SpiralMatrix/Program.cs

Разглеждам таблицата като граф и правя обхождане в дълбочина като пазя текущата посока. Когато стигна до задънена улица избирам първата свободна посока и продължавам в нея. Обхождането спира, когато сме минали всички N*N върха.

от jasssonpet (6814 точки)


0
+1 за добрата идея да използваш GitHub. Благодаря!



1
Гледам,че вариантите се поизчерпаха и за да има нещо по различно пускам и един вариант с цикъл While
http://pastebin.com/penWaXdv

от visar (10 точки)


0

Здравейте, колеги!

Моето решение на задачата има следната логика:

  1. Създавам квадратна матрица със страна n + 2;
  2. Използвам първия и последния ред / колона на матрицата като граници на игралното поле, което е подматрица със страна n;
  3. Посоката на движение задавам чрез две променливи, от които едната винаги е 0, а другата +1 или -1;
  4. След всяка стъпка проверявам дали не съм стъпил върху границата или върху посетена вече позиция и ако е така, правя стъпка назад и променям посоката, а ако позицията е свободна, записвам там поредното число;
  5. Правя нови стъпки докато броячът не надхварли n * n.

Въпросът ми е: допустимо ли е такова решение или трябва да се откажа от допълнителните редове и колони, които използвам? Как мислите?