Професионална програма
Loading...
+ Нов въпрос
krasizorbov avatar krasizorbov 548 Точки

Snake Moves

Здравейте,

Мислих как да реша тази задача и намерих лесен начин с "Queue".

Ето моето решение: https://pastebin.com/pAs1dZEa

Бих Ви помолил, ако някой е решил задачата с "масив" да сподели решението си.

Благодаря предварително!

Тагове:
1
C# Advanced
Todor030366 avatar Todor030366 11 Точки

Твоето решение дава 40 точки. Преработих го и добавих матрица и вече дава 100. Беше изпуснал, че всеки втори ред трябва да принтиш отзад напред. Ето и решението: https://pastebin.com/AL2c7ipK

2
Elena123456 avatar Elena123456 224 Точки

Благодаря за споделените решения на задачата. И аз при четенето на условието стигнах до заключението, че ще се наложи използването на опашка и печатането и в матрица.

Впрочем така и не успях да разбера защо се използва променливата capacity в решението с матрицата. След два часа опити най-накрая успях да направя едно решение, без да използвам нищо друго освен опашка и матрица. Решението ми е вдъхновено от вашите решения. smiley

- още в самото начало качвам змията в опашката;

-създавам си една чар матрица - 0' с точно толкова редове и колони, колкото имам;

-започвам да пълня новосъздадената матрица ред по ред с чаровете на змията, като ако е нечетен ред просто я пълня отзад напред. И при пъленето непрекъснато въртя oпашката- Dequeue(), Enqueue();

- и накрая я печатам

https://pastebin.com/KPah0pQa

Поздрави и Весела Коледа! :)

2
MartinBG avatar MartinBG 3908 Точки

Колегата е използвал capacity, защото зарежда всички необходими символи за матрицата в опашката предварително, т.е. при размери на матрицата 4 * 5 ще зареди 20 символа в опашката.

 

 

В решението има някои излишни неща.

Например този  код:

            var queueSnake = new Queue<char>();
            foreach (char symbol in snake)
            {
                queueSnake.Enqueue(symbol);
            }
 
            char[,] matrix = new char[rows, cols]; // create char matrix with rows and cols
            for (int row = 0; row < rows; row++)
            {
                char[] currentRow = new char[cols];
                for (int col = 0; col < cols; col++)
                {
                    matrix[row, col] = currentRow[col];
                }
            }

Може да се замени само с:

            var queueSnake = new Queue<char>(snake.ToCharArray());

            var matrix = new char[rows, cols]; // create char matrix with rows and cols

 

В основния цикъл има повторяемост на код, която може да бъде избегната.

Примерен вариант:

            for (int row = 0; row < rows; row++) // fill in the matrix
            {
                bool isEvenRow = row % 2 == 0;
                int startCol = isEvenRow ? 0 : cols - 1;
                int stopCol = isEvenRow ? cols : -1;
                int step = isEvenRow ? 1 : -1;
                
                for (int col = startCol; col != stopCol; col += step)
                {
                    char currentSymbol = queueSnake.Dequeue();
                    queueSnake.Enqueue(currentSymbol);
                    matrix[row, col] = currentSymbol;
                }
            }

 

Задачата може да се реши и с използване на двумерен масив вместо матрица, като това леко ще опрости обръщането на нечетните редове и принтирането (заради използването на вградени функционалности в езика).

Давам го като вариант, без да твърдя, че превъзхожда с нещо този с матрицата:

 

            char[][] matrix = new char[rows][];

            for (int row = 0; row < rows; row++)
            {
                matrix[row] = new char[cols];
                for (int col = 0; col < cols; col++)
                {
                    char currentSymbol = queueSnake.Dequeue();
                    queueSnake.Enqueue(currentSymbol);
                    matrix[row][col] = currentSymbol;
                }

                if (row % 2 != 0)
                {
                    matrix[row] = matrix[row].Reverse().ToArray();
                }
            }

            foreach (var row in matrix)
            {
                Console.WriteLine(new string(row));
            }

 

2
Axiomatik avatar Axiomatik 1541 Точки

* * * !Весела Коледа! * * * 

2
Elena123456 avatar Elena123456 224 Точки

@MartinBG ,

благодаря за подробните обяснения, корекциите и за по-краткото решение. След като нанеса вашите корекции, чак тогава ще си го кача в github, че найстина имам ужасно много повторения. 

Весела Коледа! 

 

@Axiomatik ,

Весела Коледа и на теб! smiley

 

Ето го и кода с нанесените корекции- змийчето се качва в опашката с един ред код и матрицата е създадена с един ред код без фор цикли. Добавих и един метод за ролването на опашката (съдържа само Dequeue() и Enqueue()), че да избегна повтаряемост на кода при запълването на матрицата- https://pastebin.com/KPah0pQa . @MartinBG , а съкратения Ви код си го запазвам и отново много благодаря!  Поздрави!

3
24/12/2020 14:08:21
dyodamasta avatar dyodamasta 1 Точки

Здравейте !

Изпращам едно примерно решение , в което основно изпозлвам едномерни и двумерни масиви. 

https://pastebin.com/HS1jbkyy

0
krum_43 avatar krum_43 660 Точки

А какво е условието на задачата?

0