[C#] Домашно Multidimensional Arrays - 7 задача


6

Условие: * Write a program that finds the largest area of equal neighbor elements in a rectangular matrix and prints its size.

1 3 2 2 2 4
3 3 3 2 4 4
4 3 1 2 3 3
4 3 1 3 3 1
4 3 3 3 1 1

 

Решениеsource.

Обяснение: Правим стандартно търсене в дълбочина (DFS) от всяка клетка, която не е обходена вече. На всяко търсене броим съседните клетки и намираме максималната сума.

 




Отговори



0
http://pastebin.com/iWkY6ZNB
Моето решение. Малко тромаво е написано, но това е втората ми рекурсия изобщо. Можеше да е и много по-зле.

от lokiko91 (790 точки)


0

Моето решение : http://pastebin.com/EdTc7upT.

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


от nikolap (555 точки)


0

ето и моето решение, без рекурсия (DFS)
http://pastebin.com/P7G6FCKi




0

DFS с рекурсия - http://pastebin.com/rRxq0h9t

Опитах се да не спестявам редове, където е възможно, за да е по-разбираем кода.

Принти и пътя, през който минава рекурсията за решението.

Същината е във FindLargestArea()


от valentin_lozev (1012 точки)


1
Здравейте,
С малко помощ от кода на zlatkov успях и аз да си направя задачата : ) адски съм благодарен, че го има този форум : )
http://pastebin.com/4WVzwbLJ
Използвал съм DFS техниката със стек. Най-тънкият момент за мен беше да си направя собствен къстъм клас Position. Чрез този клас се получава и къстем степ, в който добавям текущите позиции, които отговарят на условията да не са видяни и да са равни на текущото число. Там zlatkov най-много ме спаси : )
Поздрави!

от p.penchev (204 точки)


1

Това е моето решение : http://pastebin.com/iS8NqDwc 
Понеже има повтаряемост на код предполагам, че може да се оптимизира написаното от мен. 
Иначе идеята е следната : 
Хващаме за ушите array[0,0]  и търсим, дали в съседните му полета

  1.         MoveUp(rol - 1, col);
  2.         MoveRight(rol, col + 1);
  3.         MoveLeft(rol, col - 1);
  4.         MoveDown(rol + 1, col);
случайно няма същия елемент.
Ако няма се се продължава със следващия елемент array
[0,1] , като имаме и една помощна променлива arrayCheck, която спира методите MoveUp, MoveRight, MoveLeft и MoveDown да се връщат към вече проверени полета.
Ако има еднакви елементи, в променливата count се записва броя на еднаквите полета (обхождат се всички съседи чрез метода MoveInMatricBasic). 

Весели празници на всички, а на тези които пишат код по време на празниците: Приятно кодене !



0

http://pastebin.com/S4pp6HrS

Здравейте! Това е моето решение, без рекурсия. Неизвестно какъв метод, може би търсене по ширина, за това пък работи... :-)


от Evgenia Hristova (0 точки)


0

Code

Рекурсивно обхождане на клетките в матрицата, като използвам вложени цикли за задаване на посоките. Добра задача за усвояване на рекурсията.

П.П. Някой би ли ми споделил как да скрия линка зад заглавие във форумната система?

 


от stinger907 (307 точки)


0
Отстрани вдясно има едно бутонче Link, с него на даден текст можеш да сложиш url адрес, това важи само при Answer на тема, в коментар не можеш да ползваш опциите.

от tsonko_genov (708 точки)

0
Благодаря ти!

от stinger907 (307 точки)


0

Интересна задача, единственото неясно по условието е трябва ли да проверяваме диагоналите но от обяснението за "DFS" останах с впечатлението, че трябва, така че ги проверявам. Това е кода.

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




0

И аз успях да довърша решението почти в последния момент. Рекурсивно е, не можах да измисля друго засега. Към края има повторение на код, което  може да се оптимизира.


от nina75 (60 точки)