Loading...
marks avatar marks 23 Точки

Проблем при отпечатване на масив

Реших си задачата https://judge.softuni.bg/Contests/Compete/Index/182#4 от подговителния изпит, но проверката в Judge даде грешка на последния тест. След доста проверки на логиката и експерименти установих, че проблема идва от начина по който отпечатвам масива. Използвал съм Jagged Array.

long[][] matrix = new long[rows][];

// fill matrix
for (int row = 0; row < rows; row++)
{
    matrix[row] = Console.ReadLine()
        .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
        .Select(long.Parse)
        .ToArray();
}

Когато използвам следния код за да принтирам масива, получавам грешка на последния тест:

for (int row = 0; row < rows; row++)
{
    Console.WriteLine(string.Join(" ", matrix[row]));
}

 

но когато използвам този код, всички тестове минават:

for (int row = 0; row < rows; row++)
{
    for (int col = 0; col < cols - 1; col++)
    {
        Console.Write(matrix[row][col] + " ");
    }

    Console.WriteLine(matrix[row][cols - 1]);
}

 

Гледам кода и не мога да разбера защо има разлика при двата начина на отпечатване. Някой има ли идея откъде идва разликата?

Тагове:
0
Programming Basics
RoYaL avatar RoYaL Trainer 6849 Точки

Може ли да дадеш пълния код? На пръв поглед не виждам разлика между двете.

1
16/04/2016 22:53:57
marks avatar marks 23 Точки

Това е пълния код:

using System;
using System.Linq;

public class BlurFilter
{
    private static void Main()
    {
        long blurAmount = long.Parse(Console.ReadLine());

        int[] rowsAndCols = Console.ReadLine()
            .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray();

        int rows = rowsAndCols[0];
        int cols = rowsAndCols[1];

        long[][] matrix = new long[rows][];

        // fill matrix
        for (int row = 0; row < rows; row++)
        {
            matrix[row] = Console.ReadLine()
                .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(long.Parse)
                .ToArray();
        }

        // pixel row & col
        int[] pixelRowAndCol = Console.ReadLine()
            .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray();

        int pixelRow = pixelRowAndCol[0];
        int pixelCol = pixelRowAndCol[1];

        for (int rowShift = -1; rowShift <= 1; rowShift++)
        {
            int row = pixelRow + rowShift;

            for (int colShift = -1; colShift <= 1; colShift++)
            {
                int col = pixelCol + colShift;

                if (0 <= row & row < rows &
                    0 <= col & col < cols)
                {
                    matrix[row][col] += blurAmount;
                }
            }
        }

        // print result
        for (int row = 0; row < rows; row++)
        {
            Console.WriteLine(string.Join(" ", matrix[row]));
        }

        //for (int row = 0; row < rows; row++)
        //{
        //    for (int col = 0; col < cols - 1; col++)
        //    {
        //        Console.Write(matrix[row][col] + " ");
        //    }

        //    Console.WriteLine(matrix[row][cols - 1]);
        //}
    }
}

 

1
RoYaL avatar RoYaL Trainer 6849 Точки

Разликата между двата начина не би трябвало да има.

Мисля, че задачата обаче има грешка в условието. Чета, че пише, че всеки ред ще има точно "c" числа разделени по спейс. Отворих 10тия тест и виждам че всеки ред вместо по 20 числа има по 22 числа.

Съответно когато join-неш по спейс, принтираш и 22те числа. Обаче когато пуснеш цикъл до cols пускаш до 20 и принтираш точно колкото трябва - 20те, излишните 2 на ред, въпреки че ги пълниш в матрицата, не ги принтираш.

1
marks avatar marks 23 Точки

Благодаря.

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

 

Edit: добавянето на .Take(cols) при пълненето на матрицата решава елегантно проблема.

1
17/04/2016 00:15:07
borislav9212 avatar borislav9212 745 Точки

Защо трябва да отпечатваш масив, това нали е матрица, тя се състой от" row " и " col" и се отпечатва по този начин


 Console.Write(matrix[row][col] + " ");
0
RoYaL avatar RoYaL Trainer 6849 Точки

Защото е двумерен масив и всеки m[row] сочи към нов масив.

1
borislav9212 avatar borislav9212 745 Точки

Ясно,

не съм много добре запознат с масивите и матриците, тази седмица ще наблягам на тях да си покрия пропуските.

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