Spiral matrix with entered rows and columns

1.9k views Asked by At

As an assignment i have to create a spiral matrix where the user inputs the number of rows and number of columns. This is my code for far (first year in college studies, so don't be too hard on me)

Console.Write("Enter n: ");
        int n = int.Parse(Console.ReadLine());
        int[,] matrix = new int[n, n];
        int row = 0;
        int col = 0;
        string direction = "right";
        int maxRotations = n * n;

        for (int i = 1; i <= maxRotations; i++)
        {
            if (direction == "right" && (col > n - 1 || matrix[row, col] != 0))
            {
                direction = "down";
                col--;
                row++;
            }
            if (direction == "down" && (row > n - 1 || matrix[row, col] != 0))
            {
                direction = "left";
                row--;
                col--;
            }
            if (direction == "left" && (col < 0 || matrix[row, col] != 0))
            {
                direction = "up";
                col++;
                row--;
            }

            if (direction == "up" && row < 0 || matrix[row, col] != 0)
            {
                direction = "right";
                row++;
                col++;
            }

            matrix[row, col] = i;

            if (direction == "right")
            {
                col++;
            }
            if (direction == "down")
            {
                row++;
            }
            if (direction == "left")
            {
                col--;
            }
            if (direction == "up")
            {
                row--;
            }
        }

            // display matrica

        for (int r = 0; r < n; r++)
        {
            for (int c = 0; c < n; c++)
            {
                Console.Write("{0,4}", matrix[r, c]);

            }
            Console.WriteLine();

        }
        Console.ReadLine();

I am a bit lost as how to do this.I know how to loop the matrix with the same number for the rows and columns but it should be a non-square matrix.

4 x 3 matrix

8   9  10  1
7  12  11  2
6   5   4  3

5 x 2 matrix

3  4
12 5
11 6
10 7 
9  8
3

There are 3 answers

0
Novica Josifovski On BEST ANSWER

Here is the solution I came up with - with some help from the community here :)

Console.Write("Enter n: ");
        int n = int.Parse(Console.ReadLine());
        Console.Write("Enter m: ");
        int m = int.Parse(Console.ReadLine());
        int[,] matrix = new int[n,m];
        int row = 0;
        int col = 0;
        string direction = "right";
        int maxRotations = n * m;

        for (int i = 1; i <= maxRotations; i++)
        {
            if (direction == "right" && (col > m - 1 || matrix[row, col] != 0))
            {
                direction = "down";
                col--;
                row++;
            }
            if (direction == "down" && (row > n - 1 || matrix[row, col] != 0))
            {
                direction = "left";
                row--;
                col--;
            }
            if (direction == "left" && (col < 0 || matrix[row, col] != 0))
            {
                direction = "up";
                col++;
                row--;
            }

            if (direction == "up" && row < 0 || matrix[row, col] != 0)
            {
                direction = "right";
                row++;
                col++;
            }

            matrix[row, col] = i;

            if (direction == "right")
            {
                col++;
            }
            if (direction == "down")
            {
                row++;
            }
            if (direction == "left")
            {
                col--;
            }
            if (direction == "up")
            {
                row--;
            }
        }

        // displej matrica

        for (int r = 0; r < n; r++)
        {
            for (int c = 0; c < m ; c++)
            {
                Console.Write("{0,4}", matrix[r,c]);
            }
            Console.WriteLine();

        }
        Console.ReadLine();
    }
0
Saige Zhang On
using System;

namespace Exercise4
{
    class Program
    {
        static void Main(string[] args)
        {
            //int[,] matrix = new int[,] { { 1, 2, 3 }, { 5, 6, 7 }, { 9, 8, 7 } };
            int[,] matrix = new int[,] { { 1, 2, 3,4,5,6 }, { 20,21,22,23,24,7 }, { 19,32,33,34,25,8 },{18,31,36,35,26,9 }, { 17,30,29,28,27,10 } , { 16,15,14,13,12,11 } };
          
            Spiral s = new Spiral();
            s.Matrix = matrix;
            s.DisplayMatrix();
            s.WalkSpirally();
           

            int[,] matrix2 = new int[,] { { 1, 2, 3 }, { 5, 6, 7 }, { 9, 8, 7 } };
           
            
            Spiral s2 = new Spiral();
            s2.Matrix = matrix2;
            s2.DisplayMatrix();
            s2.WalkSpirally();
            Console.ReadLine();
        }
       
    }

    class Spiral
    {
        public int[,] Matrix;
        
        
       
        public void WalkSpirally()
        {
            int count = 0;
            int direction = 0;
            int loopCount = 0;
            int col = 0;
            int row = 0;
            int width = Matrix.GetLength(1);
            int height = Matrix.GetLength(0);
            while (count < Matrix.Length)
            {
                switch ((direction++) % 4)
                {
                    case 0://top side
                        for (; col < width - loopCount; ++col)
                        {
                            Console.Write(Matrix[row, col] + " ");
                            count++;
                        }
                        row++;
                        col--;
                        break;
                    case 1://right side

                        for (; row < height - loopCount; ++row)
                        {
                            Console.Write(Matrix[row, col] + " ");
                            count++;
                        }
                        col--;
                        row--;
                        break;
                    case 2://bottom side
                        for (; col > loopCount - 1; --col)
                        {
                            Console.Write(Matrix[row, col] + " ");
                            count++;
                        }
                        row--;
                        col++;
                        break;
                    case 3://left side

                        for (; row > loopCount; --row)
                        {
                            Console.Write(Matrix[row, col] + " ");
                            count++;
                        }

                        loopCount++;
                        col++;
                        row++;

                        break;

                }
            }
            Console.WriteLine();


        }

        public void DisplayMatrix()
        {
            for (int r = 0; r < Matrix.GetLength(1); r++)
            {
                for (int c = 0; c < Matrix.GetLength(0); c++)
                {
                    Console.Write("{0,6}", Matrix[r, c]);
                }
                Console.WriteLine();

            }
            Console.WriteLine();
        }
    }
}


0
Ken Janka On

Since this is an assignment, I won't do all the work for you, I will create a solution for a square spiral instead so you can modify it to suit your needs. With this solution, a user is suppose to enter a single value e.g n;

 Console.WriteLine("Enter n");
            int n = int.Parse(Console.ReadLine());

            var x = new string[n, n];
            int m = n;





// Initialize current to 1
int current = 1;

    // Initialize the values for topLeft, topRight, bottomRight and bottomLeft
    int[] topLeft = { 0, 0 };
    int[] topRight = { 0, (n - 1) };
    int[] bottomRight = { (n - 1), (n - 1) };
    int[] bottomLeft = { (n - 1), 0 };

    int loops = (m % 2 == 0) ? (n / 2) : ((n / 2) + 1);

    for(int spiral = 0; spiral < loops; spiral++)
    {

        // Run loop 1 to fill top most row topLeft to topRight
        for(int i = topLeft[1]; i <= topRight[1]; i++)
        {

            x[topLeft[0], i] = CheckCurrent(current, n);

            // Increment current
            current++;
        }

        // Increment topLeft and topRight
        topLeft[0] += 1;
        topRight[0] += 1;

        // Run loop 2 to fill right most column from topRight to bottomRight
        for(int j = topRight[0]; j<=bottomRight[0]; j++)
        {

            x[j, topRight[1]] = CheckCurrent(current, n);
            current++;
        }

        // Decrement topRight and bottomRight
        topRight[1] -= 1;
        bottomRight[1] -= 1;

        // Run loop 3 to fill bottom most row from bottomRight to bottomLeft
        for(int k = bottomRight[1]; k>=bottomLeft[1]; k--)
        {

            x[bottomRight[0], k] = CheckCurrent(current, n);
            current++;
        }

        // Decrement bottomRight and bottomLeft
        bottomRight[0] -= 1;
        bottomLeft[0] -= 1;

        // Run loop 4 to fill left most column
        for(int l = bottomLeft[0]; l>= topLeft[0]; l--)
        {

            x[l, bottomLeft[1]] = CheckCurrent(current, n);
            current++;
        }

    // Increment/Decrement bottomLeft and TopLeft
    topLeft[1] += 1;
    bottomLeft[1] = bottomLeft[1] + 1;

}






 // Print the spiral
  for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                Console.Write("{0} ", x[i, j]);
            }

                Console.WriteLine();
            }

This small method is used to optimize the spiral display. E.g if we have 4 as n, it means our max value will be 16 so we have to add one "0" before all 1 digit numbers to make them 2 digits. Hope you get the idea. But you can set the values directly without using the method except you will have an ugly spiral..

/// <summary>
            /// Ensure all numbers in the spiral have thesame number of digits
            /// </summary>
            /// <param name="curr">The current numbers to be added to the spiral</param>
            /// <param name="n">The number the user entered</param>
            /// <returns></returns>
public static string CheckCurrent(int curr, int n)
    {
        int lenMaxNum = (n * n).ToString().Length;
        int lenCurr = curr.ToString().Length;

        string current = curr.ToString();

        int dif = lenMaxNum - lenCurr;

    for (int i = 0; i < dif; i++)
    {
        current = "0" + current;
    }

    return current;
}