Loading...
markovood avatar markovood 11 Точки

9. Crossfire Помощ!!!

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

вече втори ден си блъскам главата с тази задача и не си намирам грешката, общо взето каквото и да направя все го докарвам до 40/ 100 в джъдж, смятам че съм изпълнил условието на 100 % но явно нещо пропускам, ПОМАГАЙТЕ МОЛЯ!!! 

Условието тук:

Моето решение тук:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Crossfire
{
    public class Crossfire
    {
        public static void Main()
        {
            // Read input and fill-up the matrix
            int[,] matrix = SetUpMatrix();

            // Read & Apply commands
            string command = Console.ReadLine();
            while (command != "Nuke it from orbit")
            {
                int[] commandTokens = command
                    .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                    .Select(int.Parse)
                    .ToArray();
                int row = commandTokens[0]; // [-2^31 + 1, 2^31 - 1]
                int col = commandTokens[1]; // [-2^31 + 1, 2^31 - 1]
                int radius = commandTokens[2];  // [0, 2^31 - 1]

                // Validate row, col
                bool isValid = Validate(matrix, row, col);
                if (isValid)
                {
                    // Mark the destroyed cells with 0 as values in the matrix start from 1
                    // mark center
                    matrix[row, col] = 0;

                    // mark to the left
                    int currentCol = col - 1;
                    for (int i = 0; i < radius; i++)
                    {
                        if (currentCol < 0)
                        {
                            break;
                        }

                        matrix[row, currentCol] = 0;
                        currentCol--;
                    }

                    // mark to the right
                    currentCol = col + 1;
                    for (int i = 0; i < radius; i++)
                    {
                        if (currentCol >= matrix.GetLength(1))
                        {
                            break;
                        }

                        matrix[row, currentCol] = 0;
                        currentCol++;
                    }

                    // mark up
                    int currentRow = row - 1;
                    for (int i = 0; i < radius; i++)
                    {
                        if (currentRow < 0)
                        {
                            break;
                        }

                        matrix[currentRow, col] = 0;
                        currentRow--;
                    }

                    // mark down
                    currentRow = row + 1;
                    for (int i = 0; i < radius; i++)
                    {
                        if (currentRow >= matrix.GetLength(0))
                        {
                            break;
                        }

                        matrix[currentRow, col] = 0;
                        currentRow++;
                    }

                    // Remove marked cells
                    matrix = RemoveEmptyCells(matrix);
                }

                command = Console.ReadLine();
            }

            // Print the remains from the initial matrix
            Print(matrix);
        }

        private static int[,] RemoveEmptyCells(int[,] matrix)
        {
            // push empty cols to the end
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                Queue<int> currentRow = new Queue<int>();
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    if (matrix[i, j] != 0)
                    {
                        currentRow.Enqueue(matrix[i, j]);
                    }
                }

                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    if (currentRow.Count > 0)
                    {
                        matrix[i, j] = currentRow.Dequeue();
                    }
                    else
                    {
                        matrix[i, j] = 0;
                    }
                }
            }

            // check for empty rows and remove them
            List<int> emptyRowsIndexes = new List<int>();
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    // if you find non-empty element go to next row
                    if (matrix[i, j] != 0)
                    {
                        break;
                    }

                    // if that's the last element and it's 0, then the row is empty, save the index
                    if (j == matrix.GetLength(1) - 1 && matrix[i, j] == 0)
                    {
                        emptyRowsIndexes.Add(i);
                    }
                }
            }

            if (emptyRowsIndexes.Count == 0)
            {
                return matrix;
            }
            else
            {
                int reducedMatrixrows = matrix.GetLength(0) - emptyRowsIndexes.Count;
                int reducedMatrixCols = matrix.GetLength(1);
                int[,] reducedMatrix = new int[reducedMatrixrows, reducedMatrixCols];

                int reducedMatrixRow = 0;
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    if (emptyRowsIndexes.Contains(i))
                    {
                        continue;
                    }

                    int reducedMatrixCol = 0;
                    for (int j = 0; j < matrix.GetLength(1); j++)
                    {
                        reducedMatrix[reducedMatrixRow, reducedMatrixCol] = matrix[i, j];
                        reducedMatrixCol++;
                    }

                    reducedMatrixRow++;
                }

                return reducedMatrix;
            }
        }

        private static bool Validate(int[,] matrix, int row, int col)
        {
            if (row < 0 || col < 0)
            {
                return false;
            }

            if (row >= matrix.GetLength(0) || col >= matrix.GetLength(1))
            {
                return false;
            }

            return true;
        }

        private static int[,] SetUpMatrix()
        {
            int[] dimensions = Console.ReadLine()
                            .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                            .Select(int.Parse)
                            .ToArray();
            int rows = dimensions[0];
            int cols = dimensions[1];
            int[,] matrix = new int[rows, cols];

            int cellValue = 1;
            for (int row = 0; row < matrix.GetLength(0); row++)
            {
                for (int col = 0; col < matrix.GetLength(1); col++)
                {
                    matrix[row, col] = cellValue;
                    cellValue++;
                }
            }

            return matrix;
        }

        private static void Print(int[,] matrix)
        {
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    if (matrix[i, j] != 0)
                    {
                        Console.Write(matrix[i, j] + " ");
                    }
                }

                Console.WriteLine();
            }
        }
    }
}

 

0
C# Advanced 13/06/2019 17:16:45
willystyle avatar willystyle 2472 Точки
Best Answer

Здравей,

грешката е, че проверяваш за валидация на центъра на удар, а явно е позволено центъра да е извън матрицата, но засегнатите полета които са вътре да се нулират. Появи се и проблем с мемори лимит на 10-ти тест, затова пуснах гарбидж колектора принудително, ако решаваш задачата с jagged arrays няма такъв проблем.

Ето ти рефактора за 100: https://pastebin.com/Z10yknni

0
markovood avatar markovood 11 Точки

Никога не бих се сетил, че би могло центъра да е извън матрицата, а обхавата на удара да може да засяга елементи вътре, баси!

Малко са го спестили в условието!!!

Благодаря за времето което си отделил за да ми помогнеш, колкото до jagged arrays мисля че с List от List<int> е най-удобно, бързо, лесно и разбираемо тий като List има удобните RemoveAll() и RemoveAt() методи, но тук пробвах да реша задачата с матрица понеже така бях започнал първоначално и исках просто да го завърша, а и е добро упражнение( СЪГЛАСЕН СЪМ ЧЕ РЕШЕНИЕТО Е АБСОЛЮТНО ДЪРВЕНО И ПЪЛНО ИЗВРАЩЕНИЕ)

Благодарско за помоща и УСПЕХИ НАПРЕД!

0
markovood avatar markovood 11 Точки

Можеш ли да помогнеш и тук ? Това е задачата 11.Parking system от същият контест

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