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();
}
}
}
}
Никога не бих се сетил, че би могло центъра да е извън матрицата, а обхавата на удара да може да засяга елементи вътре, баси!
Малко са го спестили в условието!!!
Благодаря за времето което си отделил за да ми помогнеш, колкото до jagged arrays мисля че с List от List<int> е най-удобно, бързо, лесно и разбираемо тий като List има удобните RemoveAll() и RemoveAt() методи, но тук пробвах да реша задачата с матрица понеже така бях започнал първоначално и исках просто да го завърша, а и е добро упражнение( СЪГЛАСЕН СЪМ ЧЕ РЕШЕНИЕТО Е АБСОЛЮТНО ДЪРВЕНО И ПЪЛНО ИЗВРАЩЕНИЕ)
Благодарско за помоща и УСПЕХИ НАПРЕД!
Можеш ли да помогнеш и тук ? Това е задачата 11.Parking system от същият контест
с матрица тези два теста не могат да минат, прочети коментарите по-долу
https://softuni.bg/forum/8502/advancedcsharp-izpit-28-02-2016#answer-24401