Radioactive Mutant Vampire Bunnies from Multidimensional Arrays - Exercise
Здравейте, колеги, мъча се от няколко часа със задачата, но явно бъркам доста някъде. Опитах се да дебъгна, но не мога много добре да си визуализирам матрицата и промените по нея, т.е. не ми помогна много. Ще съм много благодарен, ако някой може да ми погледне кода, и да ми каже кое не е добре, за да го огледам и поправя.
https://dox.abv.bg/download?id=59450e4634# - Линк за сваляне
Благодаря!
Здравей,
благодаря ти за отговора. Не искам все още да гледам решения, за да не се объркам. Би ли ми казал как мога да оправя моето, и къде бъркам?
Здравей,
Както казах по горе проблема ти е при разпространяване на зайците. Имаш ли ясна концепция как да го направиш?
Ако можеш да си отговориш на този въпрос си решил задачата.
Ако ли не оставаш в улица без изход.
Проблема е че ако нямаш копие на стария масив как ще разпространиш заиците с for цикъл?
Когато имаш зайче на 0,0 тогава трябва да сложиш зайче на 0,1 и 1,0
Тогава при следващата итерация на цикъла програмата ще види че имаш зайче на 0,1 и ще размножи и него и по следващото и т.н.
Нямаш друг избор освен да работиш с копие на масива или някакъв друг начин.
Ами не съм сигурен, че виждам къде е при мен проблемът. След като преместя играча, имам един for цикъл, с който разпространявам зайците (наляво, надясно, нагоре и надолу, като проверявам дали клетките съществуват в матрицата). Защо ми трябва копие на масива? Следващото преместване на играча, for-ът пак ще завърти и ще мине през всеки един нов заек. Ще има новите зайци от миналото му завъртане.
Здравей,
Може да има няколко начина за решаване на задачата.
Ти следвай твоя път.
Само че за момента нито един от твоите отговори не съвпада с това което е дадено в примерите:
изход:
BBBBBBBB
BBBBBBBB
BBBBBBBB
.BBBBBBB
..BBBBBB
won: 3 0
твоя изход:
.BBBBBBB
BBBBBBBB
BBBBBBBB
PBBBBBBB
BBBBBBBB
dead: 3 0
Другия пример също не дава верен отговор.
Тук плейара е останал в матрицата а трябва да е точка. И ако е мъртав както е според твоя отговор защо няма зайче на негово място?
Знаем че по условие зайчетата се размножават независимо дали плайара е излезнал извън матрицата или е бил убит. Зайчетата винаги се размножават и
тогава играта свършва ако другите условия са изпълнени.
Значи трябва да обмислиш размножаването на зайчетата.
Ето гледай какво се получава с твоя код:
5 8
B......B
...B....
....B..B
........
..P.....
ULLL
-----------------
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBP.....
BBB.....
Когато командата е Up след нея виж колко заека си поставил.Почти е пълно със зайци. Сега си вземи един лист и химикал и си начертай входа.
А сега размножи зайците само един път да видим дали ще получиш твоя отговор по долу.
Ами не, няма да получиш този отговор. Ще получиш по малко зайци. Защо така? Нали ти каза че с фор лупа става?
Заключение: Пак ти задавам въпрос: Как ще ги размножиш зайците?
Видях какъв е проблемът. Да кажем, че имам 1 заек на първия ред и него си го размножавам наляво, надясно, надолу и нагоре. Да, но като отиде цикълът на втория ред, там вижда, че имам заек, а пък него съм го сложил заради първия. Матрицата ми излиза правилна вече за първия и втория примерен тест, но координатите не са. Би ли ми казал къде е вече проблемът?
https://pastebin.com/Nk2MEYE6
За сега кода работи 30/100
Когато играча се двийи на ляво, според кода умира на row, col -1:
А по надолу принтираш row, col:
Ако не бъркам това ми се вижда като грешка.
Благодаря отново за отговора! Видях, но не знам как да го оправя. Ако изкарам промяната на реда или на колоната най-напред не става. Нямам много други идеи.
50/100 като си добавих допълнителни променливи, за да пазя реда и колоната, в които умира.
https://pastebin.com/h0qJyHW4
И аз направих същото и стигам до 50/100
Значи не следваме правилна концепция
Трябва да запазиш координатите където е умрял и след това да размножиш зайците още един път и да принтираш.
А в случай че е победил: координатите преди да излезне от масива, после размножаването на зайчетата и принт.
Мисля че трябва да рефакторираш кода да го направиш по четлив защото е трудно да се хване къде се чупи.
Може да го разбиеш на методи и така ще ти е по лесно да хванеш грешката.
Мисля че ще се справиш щом го докара до тук.
Доста се обърках. Разбирам каква ти е идеята, но не знам къде да вмъкна кода в програмата.
Това е последното, което можах да направя. Примерните тестове минават, но отново е 50 / 100. Не виждам къде е проблемът. Би ли ми казал?
https://pastebin.com/peH0U2eJ
Здравей,
Ще се опитам да разбера но мисля че ще трябва да рефакторирам кода да направя методи
защото кода е трудно четим и е труден за дебъгване
Дай ми време.
Значи с твоя метод на размножаване на зайците моя код работи 50/100
Тоест проблема е там някъде предполагам, но може да хвърлиш едно око на моето решение.
По скоро на метода за размножаване и да го пробваш с твоя код.
Проблемът беше в това, че не проверявам дали нямам два съседни заека, когато ги размножавам. Добавих проверката:
Преди директно сетвах lair[row, col - 1] на 'C', а ако това е заек, става грешно. Проверявах дали не е 'P', а трябва да има и тази проверка.
Сега работи ли?
Здравей,
Ето от този линк може да си свалиш решението на задачата и всички тестове(вход и изход)
По този начин ако ти гърмят 5 теста можеш да ползваш теста който гърми и да дебъгнеш.
Така ще си откриеш грешката.
Линк: https://judge.softuni.bg/Contests/118/Advanced-CSharp-Exam-11-October-2015
Благодаря ти, колега! Като добавих тези проверки задачата мина 100 / 100 (дали имам два съседни заека, когато ги размножавам).
Здравей,
Радвам се че си успял да я направиш.
Аз разгледах решението на колегите преподаватели от Софтуни(линка с тестовете който ти пратих).
Там видях че ползват метода 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" по този начин, което Аз не знаех. Този метод никога не съм го ползвал.
Но за това сме тука да се учим.
Някой пусна и код с глобални променливи. Трябва да видя как става по този начин също.
Твоя вариянт при мен не проработи, незнам докъде си го докарал. Чупеха се пет теста.
Но щом казваш че сега работи, супер.
Забравил съм да го кача в предишния ми коментар.
https://pastebin.com/qxfrWiP0
Може да го разгледаш, ако искаш и имаш време. Не знам какво е "Passing by ref" и не мога да дам адекватно мнение.