Loading...
WestsideBG avatar WestsideBG 55 Точки

Rubik Matrix

Здравейте, малко се оплетох в тая задачка, нулевите ми тестове минават, но в джъдж ми дава 30/100.. 

using System;
using System.Linq;

namespace Rubik_Matrix
{
    class RubikMatrix
    {
        static void Main(string[] args)
        {
            int[] dimension = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int rows = dimension[0];
            int cols = dimension[1];

            int[][] rubikMatrix = new int[rows][];


            int index = 1;

            for (int row = 0; row < rows; row++)
            {
                rubikMatrix[row] = new int[rubikMatrix.Length];
                for (int col = 0; col < cols; col++)
                {
                    rubikMatrix[row][col] = index++;
                }
            }


            int n = int.Parse(Console.ReadLine());

            for (int i = 0; i < n; i++)
            {
                string[] commands = Console.ReadLine().Split().ToArray();
                int rowCol = int.Parse(commands[0]);
                string destination = commands[1];
                int moves = int.Parse(commands[2]);


                if (destination == "down")
                {
                    MoveDown(rubikMatrix, rowCol, moves % rubikMatrix.Length);
                }
                else if (destination == "up")
                {
                    MoveUp(rubikMatrix, rowCol, moves % rubikMatrix.Length);
                }
                else if (destination == "left")
                {
                    MoveLeft(rubikMatrix, rowCol, moves % rubikMatrix[0].Length);
                }
                else if (destination == "left")
                {
                    MoveRight(rubikMatrix, rowCol, moves % rubikMatrix[0].Length);
                }
            }

            int counter = 1;

            for (int row = 0; row < rubikMatrix.Length; row++)
            {
                for (int col = 0; col < rubikMatrix[row].Length; col++)
                {
                    if (rubikMatrix[row][col] == counter)
                    {
                        Console.WriteLine("No swap required");
                        counter++;
                    }
                    else
                    {
                        Rearrange(rubikMatrix, row, col, counter);
                        counter++;
                    }
                }
            }
        }

        private static void Rearrange(int[][] rubikMatrix, int row, int col, int counter)
        {
            for (int targetRow = 0; targetRow < rubikMatrix.Length; targetRow++)
            {
                for (int targetCol = 0; targetCol < rubikMatrix[targetRow].Length; targetCol++)
                {
                    if (rubikMatrix[targetRow][targetCol] == counter)
                    {
                        rubikMatrix[targetRow][targetCol] = rubikMatrix[row][col];
                        rubikMatrix[row][col] = counter;
                        Console.WriteLine($"Swap ({row}, {col}) with ({targetRow}, {targetCol})");
                        return;
                    }

                }

            }
        }

        private static void MoveRight(int[][] rubikMatrix, int row, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int lastElement = rubikMatrix[row][rubikMatrix[row].Length - 1];
                for (int col = rubikMatrix.Length - 1; col > 0; col--)
                {
                    rubikMatrix[row][col] = rubikMatrix[row][col - 1];
                }
                rubikMatrix[row][0] = lastElement;
            }
        }

        private static void MoveLeft(int[][] rubikMatrix, int row, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int firstElement = rubikMatrix[row][0];
                for (int col = 0; col < rubikMatrix[row].Length - 1; col++)
                {
                    rubikMatrix[row][col] = rubikMatrix[row][col + 1];
                }
                rubikMatrix[row][rubikMatrix[row].Length - 1] = firstElement;
            }
        }

        private static void MoveUp(int[][] rubikMatrix, int col, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int firstElement = rubikMatrix[0][col];
                for (int row = 0; row < rubikMatrix.Length - 1; row++)
                {
                    rubikMatrix[row][col] = rubikMatrix[row + 1][col];
                }
                rubikMatrix[rubikMatrix.Length - 1][col] = firstElement;
            }
        }

        private static void MoveDown(int[][] rubikMatrix, int col, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int lastElement = rubikMatrix[rubikMatrix.Length - 1][col];
                for (int row = rubikMatrix.Length - 1; row > 0; row--)
                {
                    rubikMatrix[row][col] = rubikMatrix[row - 1][col];
                }
                rubikMatrix[0][col] = lastElement;
            }
        }
    }
}


 

Тагове:
0
Module: C# Advanced
anton_mironov avatar anton_mironov 19 Точки
Best Answer

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

Не съм ти тествал кода, но на пръв поглед се набива на очи, че при проверката на посоките имаш два пъти
destination == "left"

В момента гледам нещо друго, но вярвам, че това е проблема при решението.

Успех!

0
WestsideBG avatar WestsideBG 55 Точки

Благодаря ти колега, от толкова нерви не съм забелязал елементарно нещо.. УЖАС :D 

1
ValenNEW avatar ValenNEW 51 Точки

Здравей!

Добавил съм коментари там, където съм дебъгвал.

Опитай сега в judge! Ще ти даде 100 от 100. Поздрави!

using System;
using System.Linq;


    public static class RubikMatrix
    {
        public static void Main()
        {
            int[] dimension = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int rows = dimension[0];
            int cols = dimension[1];

            int[][] rubikMatrix = new int[rows][];

            int index = 1;

            for (int row = 0; row < rows; row++)
            {
                // The Length of the row dimension is not the same as the total size of the rubiMatrix Length
                rubikMatrix[row] = new int[rows];
                for (int col = 0; col < cols; col++)
                {
                    rubikMatrix[row][col] = index++;
                }
            }
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                string[] commands = Console.ReadLine().Split().ToArray();
                int rowCol = int.Parse(commands[0]);
                string destination = commands[1];
                int moves = int.Parse(commands[2]);

                // The last "esle if" was expecting incorrect destination ... "left".
                // Correct one was "right"
                if (destination == "down")
                {
                    MoveDown(rubikMatrix, rowCol, moves % rubikMatrix.Length);
                }
                else if (destination == "up")
                {
                    MoveUp(rubikMatrix, rowCol, moves % rubikMatrix.Length);
                }
                else if (destination == "left")
                {
                    MoveLeft(rubikMatrix, rowCol, moves % rubikMatrix[0].Length);
                }
                else if (destination == "right")
                {
                    MoveRight(rubikMatrix, rowCol, moves % rubikMatrix[0].Length);
                }
            }

            int counter = 1;

            for (int row = 0; row < rubikMatrix.Length; row++)
            {
                for (int col = 0; col < rubikMatrix[row].Length; col++)
                {
                    if (rubikMatrix[row][col] == counter)
                    {
                        Console.WriteLine("No swap required");
                        counter++;
                    }
                    else
                    {
                        Rearrange(rubikMatrix, row, col, counter);
                        counter++;
                    }
                }
            }
        }
        private static void Rearrange(int[][] rubikMatrix, int row, int col, int counter)
        {
            for (int targetRow = 0; targetRow < rubikMatrix.Length; targetRow++)
            {
                for (int targetCol = 0; targetCol < rubikMatrix[targetRow].Length; targetCol++)
                {
                    if (rubikMatrix[targetRow][targetCol] == counter)
                    {
                        rubikMatrix[targetRow][targetCol] = rubikMatrix[row][col];
                        rubikMatrix[row][col] = counter;
                        Console.WriteLine("Swap ({0}, {1}) with ({2}, {3})",
                        row,col,targetRow,targetCol);
                        return;
                    }
                }
            }
        }
        private static void MoveRight(int[][] rubikMatrix, int row, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int lastElement = rubikMatrix[row][rubikMatrix[row].Length - 1];
                for (int col = rubikMatrix.Length - 1; col > 0; col--)
                {
                    rubikMatrix[row][col] = rubikMatrix[row][col - 1];
                }
                rubikMatrix[row][0] = lastElement;
            }
        }
        private static void MoveLeft(int[][] rubikMatrix, int row, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int firstElement = rubikMatrix[row][0];
                for (int col = 0; col < rubikMatrix[row].Length - 1; col++)
                {
                    rubikMatrix[row][col] = rubikMatrix[row][col + 1];
                }
                rubikMatrix[row][rubikMatrix[row].Length - 1] = firstElement;
            }
        }
        private static void MoveUp(int[][] rubikMatrix, int col, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int firstElement = rubikMatrix[0][col];
                for (int row = 0; row < rubikMatrix.Length - 1; row++)
                {
                    rubikMatrix[row][col] = rubikMatrix[row + 1][col];
                }
                rubikMatrix[rubikMatrix.Length - 1][col] = firstElement;
            }
        }
        private static void MoveDown(int[][] rubikMatrix, int col, int moves)
        {
            for (int i = 0; i < moves; i++)
            {
                int lastElement = rubikMatrix[rubikMatrix.Length - 1][col];
                for (int row = rubikMatrix.Length - 1; row > 0; row--)
                {
                    rubikMatrix[row][col] = rubikMatrix[row - 1][col];
                }
                rubikMatrix[0][col] = lastElement;
            }
        }
    }

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