C# Part2 - homework - 02.MultidimensionalArrays (11.2016)


1

Здравейте, отварям тема за домашните от категория: C# Part2 - homework - 02.Multidimensional Arrays (11.2016), с цел дискусии, коментари и помощ, ако е необходима на някого.

Ето моите домшни: HW-Git




Отговори



1

Браво колега,

Чудесни решения и най-важното - описателни и разбираеми. +1




0
Благодаря! :)

от todor.chupov (380 точки)


0
А може ли да обясниш 3-та и 7-та за какво иде реч, че изобщо не мога да разбера как да ги реша? Хайде 3-та долу-горе поразбрах как да се направи, но на 7-ма просто не ми идва идея.



4

Да разбира се. Първо 7-ма, се решава с рекурсия и е малко трудна, но докато я хванеш. Препоръчвам ти да иззгледаш едно две видеа за рекурсия(аз гледах на Ники, Евлоги и Наков), изгледай и поне една лекция за графи. Препоръчвам ти, "Курс Основи на Графите (ное. 2014)", лекцията на Ивайло (цък).

Самата задача, както споменах се използва рекурсия(но може и да я решиш линейно) и трябва да си избереш един от двата вида алгоритми за обхождане на графи DFS(обхождане в дълбочина с рекурсия) и BFS (обхождане в ширина с рекурсия или линейно).

Ако избереш BFS има една видео, не съм го гледал, но там решават една задача (цък).

Аз използвах DFS, рекурсивно. Основната идея е, че пускаш в четирите посоки рекурсия. И ако първо си избрал посока надолу и минаваш проверката, рекурсията прави същото(тръгва) пак за четирите посоки и т.н., докато стигнеш дъно на рекурсията.

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

Хвърли и един поглед на решението ми, мисля, че бързо ще се ориентираш, но изгледай видеата.

=====================

3-та е по-лесна. Използвах похвата за намиране на максимална платформа в матрица. има го в книгата на Наков и в лекцията на Ники е подробно обяснено (цък).

Идеята е, за самата матрица си правиш една по-малка само за обхождане (като цяло размера и е нещо от рода 3х3) и когато намери еднакъв елемент, т.е. има съвпадение, трупаш резултата(+1) в трета матрица(със същите размери като голямата). Самото натрупване е като техниката динамично оптимиране за намиране на най-дълга нарастваща подредица в масив (от задача - 01.Arrays\18.RemoveElementsFromArray).

И тук мога да ти препоръчам да пробваш решението ми в дебъг стъпка, по стъпка и лесно ще схванеш идеята. Нарсувал съм и една картинка с алгоритъма.

HW-GitHub

Ако има още нещо питай. :)


от todor.chupov (380 точки)

0

Колега, обясненията ти наистина са много полезни. Аз съм от тези, които преди месец започнаха да програмират за първи път и идеята за рекурсии и графи ми е много далечна все още. Видеата, които линкна със сигурно ще са изключително полезни. Мерси!

Исках да използвам мястото да попитам дали по време на курса тези две теми - рекурсии и графи ще се засегне и в коя лекция би било това?


от mkanovski (552 точки)



0
Аз имам проблем с втора задача дава ми рънтайм ерори. Много се изнервям защото искам да видя тестовете с които тества системата. Защо не ги дават. Все едно да ти кажат това е колона това е земя строй мост. Ами аз искам да видя подводните камъни. 



0

Колега, както и при мен се е получавало, вероятно логиката на задачата е вярна, просто има проблем с типа променливи които си използвал (string, int и т.н.). Иначе и тази задачата(2-ра) се решава с похвата максимална площадка в матрица. Ето видео (цък).

Ако искаш побликувай кода си тук да го видим, или разгледай моя варянт.


от todor.chupov (380 точки)

0

рънтайм ерори - това най често означава че кода ти дава грешка (например опитваш да адресираш масив с отрицателен индекс)

MaximalSum - това ли е втора задача


от mitkop (578 точки)



0

Може ли да разясниш първа задача,

че не я схванах много?


от GeorgeVT (55 точки)


0

Да естествено колега.  Имаш 4-ри шаблона на матрици, подава ти се число N (размер на матрица, пр: 5х5), послед ти се подава и вид на матрицата (а, b, c, d). Твоята задача е да вкараш 4-ри различни логики за принтиране на матрица в една програма.

Ако искаш си разпиши 4-рите матрици с химикал за да си представиш посоките на принтиране на числата(аз така бях направил)..

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

матрица B: числата се принтират първо (за първата колкона) в посока ОТ ГОРЕ надолу, а после (за втората колона) в посока ОТ ДОЛУ нагоре.

До тук и двата вариянта стават с по два вложени цикъла.

матрица C: диагонална матрица, започва да принтира от долния ляв ъгъл(тази наистина е хубаво да си разпишеш защото посоката и е шантава). Аз я направих така, започвам принтиране на числата от долния ляв ъгъл и разделих матрицата на две по диагонал (т.е. стана нещо като два тръгълника). Или два вложени цикъла за полувина (единия триъгълник) и два за другата (другия триъгълник).

матрица D: спирална матрица, принтира числата спираловидно, от външния край на матрицата на вътре. Почва от горния ляв ъгъл. Мисля, че в интернет има доста примери за тази вид матрица. Ако искаш погледни и аз как съм я направил, с четири цикъла, като свеки един работи за съответнат посока. Един посока: от горе надолу, друг посока: от ляво надясно, трети посока: от долу нагоре и четвътия от дясно наляво, отивайки до числата, от първия цикъл.

Дано съм успял горе долу да обясня, ако има нещо още питай. :)


от todor.chupov (380 точки)

0

Реда на изпълнение е :.

Числата първо се подреждат в нов двумерен масив(матрица), като подредбата отговаря на условието на задачата (A - отгоре надолу, В - ..., C ..., D-....),

след това се принтират отляво надясно, отгоре на долу, но с готови стойности от масива.

реално решението на задачата е да определиш алгоритъм за попълване на матрицата

според мен може да се мине с един или 2 цикъла.

прилагам моето решение

namespace FillMatrix { using System; public class FillMatrix { static void Main() { //Stratup int sizeOfMatrix = int.Parse(Console.ReadLine()); string typeOfMatrix = Console.ReadLine(); //Engine switch (typeOfMatrix) { case "a": PrintMattrix(MattrixTypeA(sizeOfMatrix)); break; case "b": PrintMattrix(MattrixTypeB(sizeOfMatrix)); break; case "c": PrintMattrix(MattrixTypeC(sizeOfMatrix)); break; case "d": PrintMattrix(MattrixTypeD(sizeOfMatrix)); break; default: Console.WriteLine("Invalid type of command"); break; } } // Factory private static int[,] MattrixTypeA(int size) { var mattrix = new int[size, size]; // magic for (int i = 0; i < size * size; i++) { int y = i / size; int x = i % size; mattrix[x, y] = i + 1; } return mattrix; } private static int[,] MattrixTypeB(int size) { var mattrix = new int[size, size]; // magic for (int i = 0; i < size * size; i++) { int y = i / size; int isOdd = (y) % 2; int isNegativ = 1 - isOdd * 2; int x = (isOdd * (size - 1)) + isNegativ * (i % size); mattrix[x, y] = i + 1; } return mattrix; } private static int[,] MattrixTypeC(int size) { var mattrix = new int[size, size]; int number = 1; // magic for (int i = 0; i < size; i++) { int y = size - 1 - i; int x = 0; for (int j = 0; j <= i; j++) { mattrix[y, x] = number; mattrix[size - 1 - y, size - 1 - x] = size * size + 1 - number++; x++; y++; } } return mattrix; } private static int[,] MattrixTypeD(int size) { var mattrix = new int[size, size]; // magic int numbers = 1; int dx = 0, dy; int x = 0, y = 0, step = size - 1; for (int i = size * 2 - 1; i >= 1; i--) { int period = (size * 2 - i) % 4; dy = (2 - period) * (period % 2); for (int k = 0; k < step; k++) { mattrix[y, x] = numbers++; x += dx; y += dy; } step = i / 2; dx = dy; } mattrix[y, x] = numbers; return mattrix; } //Print private static void PrintMattrix(int[,] matrtixToPrint) { for (int outer = matrtixToPrint.GetLowerBound(0); outer <= matrtixToPrint.GetUpperBound(0); outer++) { string result = ""; for (int inner = matrtixToPrint.GetLowerBound(1); inner <= matrtixToPrint.GetUpperBound(1); inner++) { result += matrtixToPrint[outer, inner] + " "; // Console.WriteLine(string.Join()); } Console.WriteLine(result.Trim()); } } } }


от mitkop (578 точки)


1
Страхотни решения, Колега! Много ми хареса как е направена 7-ма задача. Чудесна работа с рекурсиите! +

от Procelius (70 точки)


0
Благодаря колега! :)

от todor.chupov (380 точки)


1
Ето домашно и от мен с много коментари и в user friendly стил цък...

от markovood (374 точки)


0

Може ли малко помощ, не разбирам защо кода ми води до 60/100 в бгкодер.

using System; using System.Linq; class MaximumSum { static int GetSum(int[,] matrix, int col, int row, int square) { int sum = 0; for (int i = 0; i < square; i++) { for (int j = 0; j < square; j++) { sum += matrix[col + i, row + j]; } } return sum; } static void Main() { int[] nm = Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); int n = nm[0]; int m = nm[1]; int[,] matrix = new int[n, m]; int currSum = 0; int maxSum = int.MinValue; int square = 3; for (int row = 0; row < n; row++) { int[] help = Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); for (int col = 0; col < m; col++) { matrix[row, col] = help[col]; } } for (int col = 0; col <= n - square; col++) { for (int row = 0; row <= n - square; row++) { currSum = GetSum(matrix, col, row, square); maxSum = Math.Max(maxSum, currSum); } } Console.WriteLine(maxSum); } }

Благодаря!


от olebg (598 точки)


1

Привет,

В Main() метода във втория цикъл, където смяташ сумата, вътрешният for трябва да се движи до row <= m - square, при теб е n, а пък матрицата може и да е 5x6, заради това и ти дава Грешка при изпълнение на някои тестове - излизаш от границите. Оправи си го и излизат точките :)


от Daniela_Popova (1125 точки)

0

@olegbg, струва ми се, че в

        for (int col = 0; col <= n - square; col++)
        {
            for (int row = 0; row <= n - square; row++)
            {
                currSum = GetSum(matrix, col, row, square);
                maxSum = Math.Max(maxSum, currSum);
            }
        }

външния цикъл - col трябва да е col<=m - square


от mitkop (578 точки)