Софтуерно Инженерство
Loading...
+ Нов въпрос
markovood avatar markovood 8 Точки

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 914 Точки
Best Answer

Здравей,

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

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

0
markovood avatar markovood 8 Точки

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

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

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

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

0
markovood avatar markovood 8 Точки

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

0