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 235 Точки

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

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

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

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

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

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

https://pastebin.com/KPah0pQa

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

2
MartinBG avatar MartinBG 4803 Точки

Колегата е използвал 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 2422 Точки

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

2
Elena123456 avatar Elena123456 235 Точки

@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 756 Точки

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

0
Mr.D.Dimitrov avatar Mr.D.Dimitrov 3 Точки

using System;
using System.Linq;

namespace snakeMoves
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] size = ReadLine();
            string[,] matrix = new string[size[0], size[1]];
            for (int i = 0; i < size[0]; i++)
            {
                if (i % 2 == 0)
                {
                    for (int j = 0; j < size[1]; j++)
                    {
                        matrix[i, j] += GetNextChar();
                    }
                }
                else
                {
                    for (int j = size[1] - 1; j >= 0; j--)
                    {
                        matrix[i, j] += GetNextChar();
                    }
                }
            }
            for (int i = 0; i < size[0]; i++)
            {
                for (int j = 0; j < size[1]; j++)
                {
                    Console.Write(matrix[i, j]);
                }
                Console.WriteLine();
            }
        }
        static int counter = 0;
        static string inputWord=Console.ReadLine();
        private static char GetNextChar()
        {
            char nextChar = inputWord[counter];
            counter++;
            if (counter >= inputWord.Length)
            {
                counter = 0;
            }
            return nextChar;
        }
        static int[] ReadLine()
        {
            return Console.ReadLine()
                .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray();
        }
    }
}

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