Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

kaloyan_kolev avatar kaloyan_kolev 10 Точки

Radioactive Mutant Vampire Bunnies from Multidimensional Arrays - Exercise

Здравейте, колеги, мъча се от няколко часа със задачата, но явно бъркам доста някъде. Опитах се да дебъгна, но не мога много добре да си визуализирам матрицата и промените по нея, т.е. не ми помогна много. Ще съм много благодарен, ако някой може да ми погледне кода, и да ми каже кое не е добре, за да го огледам и поправя. 

 

https://pastebin.com/91yYRLzv

https://dox.abv.bg/download?id=59450e4634# - Линк за сваляне

 

Благодаря!

Тагове:
0
C# Advanced 23/05/2019 20:15:18
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Ето едно решение: https://pastebin.com/1AmT8LVw

Тук основния проблем е с разпространяването на зайците.

За да го постигнеш трябва да създадеш нов масив. В такъв случай суздаваш метод и правиш "passing by REF"

Ползваш стария масив да размножиш зайците в новия.

Най - накрая правиш стария масив да е равен на новия и понеже в метода ползваш "ref" (мястото в паметта където е стария масив), метода връща новия масив(копието) на мястото на стария.

Разгледай кода, не е труден за разбиране.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Здравей,

благодаря ти за отговора. Не искам все още да гледам решения, за да не се объркам. Би ли ми казал как мога да оправя моето, и къде бъркам?

0
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Както казах по горе проблема ти е при разпространяване на зайците. Имаш ли ясна концепция как да го направиш?

Ако можеш да си отговориш на този въпрос си решил задачата.

Ако ли не оставаш в улица без изход.

Проблема е че ако нямаш копие на стария масив как ще разпространиш заиците с for цикъл?

Когато имаш зайче на 0,0 тогава трябва да сложиш зайче на 0,1 и 1,0

Тогава при следващата итерация на цикъла програмата ще види че имаш зайче на 0,1 и ще размножи и него и по следващото и т.н.

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

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Ами не съм сигурен, че виждам къде е при мен проблемът. След като преместя играча, имам един for цикъл, с който разпространявам зайците (наляво, надясно, нагоре и надолу, като проверявам дали клетките съществуват в матрицата). Защо ми трябва копие на масива? Следващото преместване на играча, for-ът пак ще завърти и ще мине през всеки един нов заек. Ще има новите зайци от миналото му завъртане.

0
24/05/2019 08:54:19
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Може да има няколко начина за решаване на задачата.

Ти следвай твоя път.

Само че за момента нито един от твоите отговори не съвпада с това което е дадено в примерите:

изход:

BBBBBBBB

BBBBBBBB

BBBBBBBB

.BBBBBBB

..BBBBBB

won: 3 0

твоя изход:

.BBBBBBB
BBBBBBBB
BBBBBBBB
PBBBBBBB
BBBBBBBB
dead: 3 0

Другия пример също не дава верен отговор.

Тук плейара е останал в матрицата а трябва да е точка. И ако е мъртав както е според твоя отговор защо няма зайче на негово място?

Знаем че по условие зайчетата се размножават независимо дали плайара е излезнал извън матрицата или е бил убит. Зайчетата винаги се размножават и

тогава играта свършва ако другите условия са изпълнени.

Значи трябва да обмислиш размножаването на зайчетата.

0
krasizorbov avatar krasizorbov 548 Точки

Ето гледай какво се получава с твоя код:

5 8
B......B
...B....
....B..B
........
..P.....
ULLL
-----------------
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBP.....
BBB.....

Когато командата е Up след нея виж колко заека си поставил.Почти е пълно със зайци. Сега си вземи един лист и химикал и си начертай входа.

А сега размножи зайците само един път да видим дали ще получиш твоя отговор по долу.

Ами не, няма да получиш този отговор. Ще получиш по малко зайци. Защо така? Нали ти каза че с фор лупа става?

Заключение: Пак ти задавам въпрос: Как ще ги размножиш зайците?

1
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Видях какъв е проблемът. Да кажем, че имам 1 заек на първия ред и него си го размножавам наляво, надясно, надолу и нагоре. Да, но като отиде цикълът на втория ред, там вижда, че имам заек, а пък него съм го сложил заради първия. Матрицата ми излиза правилна вече за първия и втория примерен тест, но координатите не са. Би ли ми казал къде е вече проблемът?

 

https://pastebin.com/Nk2MEYE6

 

 

0
24/05/2019 15:11:45
krasizorbov avatar krasizorbov 548 Точки

За сега кода работи 30/100

Когато играча се двийи на ляво, според кода умира на row, col -1:

А по надолу принтираш row, col:

Ако не бъркам това ми се вижда като грешка.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Благодаря отново за отговора! Видях, но не знам как да го оправя. Ако изкарам промяната на реда или на колоната най-напред не става. Нямам много други идеи.

0
24/05/2019 15:55:28
kaloyan_kolev avatar kaloyan_kolev 10 Точки

50/100 като си добавих допълнителни променливи, за да пазя реда и колоната, в които умира.

 

https://pastebin.com/h0qJyHW4

0
krasizorbov avatar krasizorbov 548 Точки

И аз направих същото и стигам до 50/100

Значи не следваме правилна концепция

Трябва да запазиш координатите където е умрял и след това да размножиш зайците още един път и да принтираш.

А в случай че е победил: координатите преди да излезне от масива, после размножаването на зайчетата и принт.

Мисля че трябва да рефакторираш кода да го направиш по четлив защото е трудно да се хване къде се чупи.

Може да го разбиеш на методи и така ще ти е по лесно да хванеш грешката.

Мисля че ще се справиш щом го докара до тук.

0
24/05/2019 16:42:12
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Доста се обърках. Разбирам каква ти е идеята, но не знам къде да вмъкна кода в програмата. 

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Това е последното, което можах да направя. Примерните тестове минават, но отново е 50 / 100. Не виждам къде е проблемът. Би ли ми казал?

 

https://pastebin.com/peH0U2eJ

0
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Ще се опитам да разбера но мисля че ще трябва да рефакторирам кода да направя методи

защото кода е трудно четим и е труден за дебъгване

Дай ми време.

0
krasizorbov avatar krasizorbov 548 Точки

Значи с твоя метод на размножаване на зайците моя код работи 50/100

Тоест проблема е там някъде предполагам, но може да хвърлиш едно око на моето решение.

По скоро на метода за размножаване и да го пробваш с твоя код.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Проблемът беше в това, че не проверявам дали нямам два съседни заека, когато ги размножавам. Добавих проверката:

if (lair[row, col - 1] != 'B')
{
    lair[row, col - 1] = 'C';
}

Преди директно сетвах lair[row, col - 1] на 'C', а ако това е заек, става грешно. Проверявах дали не е 'P', а трябва да има и тази проверка.

0
24/05/2019 23:35:34
krasizorbov avatar krasizorbov 548 Точки

Сега работи ли?

0
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Ето от този линк може да си свалиш решението на задачата и всички тестове(вход и изход)

По този начин ако ти гърмят 5 теста можеш да ползваш теста който гърми и да дебъгнеш.

Така ще си откриеш грешката.

Линк: https://judge.softuni.bg/Contests/118/Advanced-CSharp-Exam-11-October-2015

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Благодаря ти, колега! Като добавих тези проверки задачата мина 100 / 100 (дали имам два съседни заека, когато ги размножавам).

0
krasizorbov avatar krasizorbov 548 Точки

Здравей,

Радвам се че си успял да я направиш.

Аз разгледах решението на колегите преподаватели от Софтуни(линка с тестовете който ти пратих).

Там видях че ползват метода Clone();

Интересно е описанието на метода от Microsoft:

A shallow copy of an Array copies only the elements of the Array, whether they are reference types or value types, but it does not copy the objects that the references refer to. The references in the new Array point to the same objects that the references in the original Array point to.

Тоест те също полазват "Passing by ref" по този начин, което Аз не знаех. Този метод никога не съм го ползвал.

Но за това сме тука да се учим.

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

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

Но щом казваш че сега работи, супер.

0
kaloyan_kolev avatar kaloyan_kolev 10 Точки

Забравил съм да го кача в предишния ми коментар. 

https://pastebin.com/qxfrWiP0

Може да го разгледаш, ако искаш и имаш време. Не знам какво е "Passing by ref" и не мога да дам адекватно мнение. 

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