Обръщане на многомерен масив (не Reverse a Mirror да кажем)


1

Някой знае ли сравнително лесен начин да се постигне следния ефект (един вид Mirror на 2D масив):

Би било добре ако можеше да се направи Array.Reverse на всяко един от редовете например, но май не става. Въпроса ми е свързан с 3-та задача от Многомерни масиви. Там ползвам един метод за проверката по едната посока на диагонала и за проверката по колони и редове. За да не пиша друг метод ми се иска да мога да го обърна (и би било полезно да се знае).

 




Отговори



3
Здравей,
Най-лесно ми се вижда да завъртиш два цикъла и да създадеш нов огледален масив. Във въшният цикъл ходиш ред по ред, а във вътрешния тръгваш от последния елемент и пълниш новия масив.
Поздрави!

от nikolaikolarov (2177 точки)


3
На пръв поглед, с два for-цикъла четеш масива диагонал по диагонал и с аналогични цикли пълниш в новия. Итераторът на първия for-цикъл е по редове от 4 до 0, като в този фор имаш примерно и един while с променлива за броя на различните колони (за да прочетеш целия диагонал, започваш от row = x, col = 0 до row = 4, col = y, като х и y увеличаваш с 1). Итераторът на втория for-цикъл е по колони от 1 до 7, като в този цикъл ще четеш, аналогично на първия, целите диагонали. В матрицата-резултат, на всеки прочетен диагонал по аналогичен начин ще записваш. Не виждам нещо специално и сложно в задачата. :)

от varbanoff (2325 точки)


0
Да, предложеното вечe решение да записваш всичко наобратно е по-тариактско от това да обхождаш по диагоналите. :)

от varbanoff (2325 точки)


2

Най лесният и бърз начин е да разменяш първият със последният, вторият с предпоследният.. и така нататък на всеки ред. Дори да имаше готова имплементация както array.Sort, тя щеше да е написана по същият начин.

Ето го със int матрица : http://pastebin.com/tNVs1vFZ

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

Във твоят случай просто променяш инт матрицата със стринг и на местата със int.Parse(console.Readline()) пишеш само : Console.ReadLine()

Надявам се да съм помогнал :)


от tddhome (3086 точки)


1

Благодаря на всички отзовали се.

Аз си го реализирах в конкретната програма така.

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

Още веднъж благодаря за отговорите.


от dimo.petrof (2887 точки)


1

Здравей,

Според мен е редно да укажеш спрямо коя равнина ще го правиш огледален - то по картинката си личи в случея че е по вертикалата, но аз драснах набързо един generic метод, на който можед да задаваш дали да прави масива (от всякакъв тип елементи) огледален спрямо вертикалата или хоризонталата (добавяш H или V като викаш метода). Ето ти кода + едно тестване в main метода :

http://pastebin.com/VANd3BUv


от dzhenko (3893 точки)


1
Значи... имаш метод който проверява за редове, за колкони и за един диагонал, и искаш да обърнеш масива огледално само за да провериш другия диагонал?
Аз бих избрал единия от двата подхода:
1. Бих написал още няколко реда код, които да проверяват и другия диагонал. Скучно и ... неатрактивно.
2. Бих следвал максимата "като ще е гарга - да е рошава" и бих си направил метод, който да ... да "заърти" масива на 90 градуса - редовете да станат колони. Така от метода за проверка може да отпадне едното парче. Трябва ти да търсиш само ред и диагонал наляво примерно, след това "завърташ" масива и правиш отново същата проверка, която ще провери за ред и диагонал наляво завъртяния масив, което ще е проверка за колона и диагонал надясно на оригиналния.
Но интелигентното за мен решение е да се почне от една клетка на матрицата, и да се проверява едновременно във всички непроверени и възможни посоки - примерно почваш от горен ляв ъгъл и вървиш едновременно надясно, надолу, и по двата диагонала надолу. Да, диагонала "надолу-наляво" в първия момент ще е с дължина нула, но ще се увеличава с изместването на началната точка надясно.
Проверката нагоре, наляво и по диагонали нагоре е безмислена - ако е имало линия там, тя вече ще е отчетена при проверките за надолу, надясно и диагоналите надолу.

от JulianG (5316 точки)


1

Използвайки jagged array можеш да направиш:

for (int i = 0; i < arr.Length; i++)

{
    Array.Reverse(arr[i]);             
 }
Погледни в лекцията как се дефинират, или тук.

от simonkazakov (1116 точки)