[C#] Homework: Loops 17: Spiral Matrix


3

Това е единствената задача на която не можах да намеря решение във форума. Ако някой има проблеми със задачата, може да си помогне със моето решение. Не съм сигурен, дали това е най- доброто решение, но получава 100/100 от bgcodder. Ако имате въпроси по задачата можете да питате, ще се опитам да отговоря.

using System;
namespace Spiral_Matrix
{
    class Program
    {
        static void Main()
        {
            int N = int.Parse(Console.ReadLine());
            int[,] k = new int[N,N];
            int flag = 0;
            int br=1;
            int tempRight = N-1; 
            int tempLeft = 0;
            int tempTop = 0;
            int tempbot = N-1;

            for (int i = 0; i < N*2-1; i++)
            {
                if (flag == 0)
                {
                    for (int j = tempLeft; j <= tempRight; j++)
                    {
                        k[tempTop,j] = br;
                        br++;
                    }
                    flag++;
                    tempTop++;
                    continue;
                }
                if (flag == 1)
                {
                    for (int j = tempTop; j <= tempbot; j++)
                    {
                        k[j, tempRight] = br;
                        br++;
                    }
                    flag++;
                    tempRight--;
                    continue;
                }
                if(flag==2)
                {
                    for (int j = tempRight; j >= tempLeft; j--)
                    {
                        k[tempbot, j] = br;
                        br++;
                    }
                    flag++;
                    tempbot--;
                    continue;
                }
                if (flag == 3)
                {
                    for (int j = tempbot; j >= tempTop; j--)
                    {
                        k[j, tempLeft] = br;
                        br++;
                    }
                    flag = 0;
                    tempLeft++;
                    continue;
                }
            }

            for (int i = 0; i < N; i++)
            {

                for (int j = 0; j < N; j++)
                {
                    Console.Write("{0} ", k[i, j]);
                }
                Console.Write("\n");

            }
        }
    }
}




Отговори



3

Здравей колега, реших и аз да постна моето решение, защото го правя по по-различен начин и може също да е полезно на някого. Писал съм и коментари.

using System; class SpiralMatrix { static void Main() { int n = int.Parse(Console.ReadLine()); // Create a square matrix with (x, y) coordinates int[,] matrix = new int[n, n]; // calculate the number of inner squares int innerSquares = (int)Math.Ceiling(n / 2.0); // store the size of the current square int currentSideLength = n; // this value will increment every time we fill in a number int counter = 1; // run this loop for each inner square for (int i = 0; i < innerSquares; i++) { // fill in top side for (int j = 0; j < currentSideLength; j++) { matrix[i + j, i] = counter++; } // fill in right side for (int j = 1; j < currentSideLength; j++) { matrix[n - 1 - i, i + j] = counter++; } // fill in bottom side for (int j = currentSideLength - 2; j > -1; j--) { matrix[i + j, n - 1 - i] = counter++; } // fill in left side for (int j = currentSideLength - 2; j > 0; j--) { matrix[i, i + j] = counter++; } // After finishing with the current square, the next one has 2 less sides currentSideLength -= 2; } // print the matrix for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0} ", matrix[j, i]); } Console.WriteLine(); } } }


от markshark05 (160 точки)


0

много добро решение, ясно и функциотално,

int innerSquares = (int)Math.Ceiling(n / 2.0); - не е нужно, просто напиши

int innerSquares = n / 2; - при делене на int дробната част изчезва


от mitkop (578 точки)


0

И двамата сте го направили по различен начин, но и двамата сте използвали масиви. Аз хвърлих малко мисъл как да го направя без масиви, и след като не измислих нищо, и аз се примирих с това, че ще трябва да се ползват неизучените още масиви. Ако ви е любопитно ето го и моето решение (което също е различно).

https://github.com/ShwangShwing/telerik-academy-work/blob/master/CSharpFundamentals/hw09-17SprialMatrix/Program.cs

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


от ShwangShwing (339 точки)


1
Много бързо отхвърлих идеята за решаване без масив. Единият вариант беше да се използва позицията на курсора в конзолата, обаче, както се вижда и от примера, при двуцифрени (трицифрени също) се получава офсет и нежелано усложнение. Другият бе да се хване закономерност в редовете и да печата ред по ред на базата на тази закономерност, пак доста неприятно. Най-вероятно може и по двата начина. Има и изчанчени варианти, като да ползваш string като масив от char-ве за grid, само дето е малко immutable, ... има и други, някакви стринг-ве да конкатенираш примерно ... Много по-коректният начин е със структура от данни, самото име на задачата подсказва употреба на 2d array (Matrix). Така или иначе както гледам хората масово си използват знания от по-предни лекции/ курсове за решаване на лесните задачи, предполагам, че е ОК. На изпита никой няма да те пита това учено ли е или не, ако закъсаш на някоя задача използваш всичко, което знаеш.

от ndvalkov (60 точки)

1
Номера с курсора може да работи на конзолата, ама автоматичните тестове няма да минат с него.

от ShwangShwing (339 точки)



0

Семпло и разбираемо решение, мисля че ще ми бъде от полза.

Поздрави :)


от ivalin.venkov (125 точки)


1

using System;

namespace _17.Spiral_Matrix
{
    class Program
    {
        static void Main()
        {
            byte N = byte.Parse(Console.ReadLine());
            short[,] array = new short[N, N];
            for (int i = 0; i < N; i++)
            {
                array[0, i] = (short)(i+1);
            }
            short number = N;
            short row = 0;
            short col = (short)(N - 1);
            byte stop = (byte)(N - 1);
            while (true)
            {
                byte counter = 0;
                if (number == N*N)
                {
                    break;
                }
                while (counter < stop)
                {
                    number++;
                    row++;
                    counter++;
                    array[row, col] = number;
                }
                counter = 0;
                if (number == N * N)
                {
                    break;
                }
                while (counter < stop)
                {
                    number++;
                    col--;
                    counter++;
                    array[row, col] = number;
                }
                stop--;
                counter = 0;
                if (number == N * N)
                {
                    break;
                }
                while (counter < stop)
                {
                    number++;
                    row--;
                    counter++;
                    array[row, col] = number;
                }
                counter = 0;
                if (number == N * N)
                {
                    break;
                }
                while (counter < stop)
                {
                    number++;
                    col++;
                    counter++;
                    array[row, col] = number;
                }
                stop--;
            }
            for (row = 0; row < N; row++)
            {
                for (col = 0; col < N; col++)
                {
                    Console.Write(array[row, col]+" ");
                }
                Console.WriteLine();
            }          
        }
    }
}

Малко може да ви се стори дървено решението заради тия IF-ове, но реално условието се проверява когато цикълът свърши, и може да презапише елемент върху елемент(примерно ако условието ми е i<N , още на средата на цикъла да го изпълня , но i ще си се увеличава до края на цикъла , докато не свърши и не се провери условието). Затова го направих с безкраен цикъл и if-ове , които да проверяват условието след всеки вложен цикъл. Иначе мисля че е семпло направено другото и се разбира какво се случва.