[C# Part 2] Exam 3D Tron


3

здравейте, колеги,

вчера беше изпита по C#part2. Задачата с Трон ми се видя доста интересна и след дълго умуване ми хрумна идеята че не е задължително да се правят каквито и да е кубове.Не може ли просто да разгледаме куба разгърнат както е показано на фигурата.

Правим си един двумерен масив char[,] и следим дали позициите на играчите по вертикаланта са - >= х или < 0, а по хоризонталата - < 0 (и променяме новото местоположение  на y + z + y+ z - 1) или >= y + z + y+ z (и променяме новото положение на 0). За всяка посетена позиция оставяме в масива символа "|" (за стена). И всичко останали са if-ове и else-ове. 

ПС Понеже в задачата пише че играчите могат да се движат и по ръбовете, това мисля че можем просто да го симулираме като увеличим големината на масива с +1 (за х и за у, не и за z). За съжаление не ми стигна времето на изпита, но мисля че щеше да се получи.Как смятате?




Отговори



2
Идеята ти е чудесна, и всъщност авторското решение е именно с нея.
Другият вариант е директно с 3d - всеки път когато преминеш ръб, посоката ти на движение в пространството се променя. Ако използваш това че играчите във всеки момент са на повърхността на куба, дори не ти трябва да следиш на коя стена си - просто сменяш посоката така че играчът да се движи навътре в стената.

от staafl (5770 точки)


0
колкото до размерите на 2D масива, вертикалата е x+1, хоризонталата е 2*(y+z) - една стена има y+1/z+1 вертикални позиции, но ако ги вземеш така, ще преброиш ръбовете по два пъти; ако пък за всяка стена изпускаш единия ръб, четирите стени се снаждат и става точно y + z + y + z

от staafl (5770 точки)


0

Тази задача ми изглежда досъщ като нашата Trails 3D, където и аз по същия начин разгънах паралелепипеда, само дето Y и X са ни разменени. Ръбовете ми отговаряха на граничните стойности на матрицата: 0 и Lenght, като ако излезеше от границите по вертикала играча изгаряше, а когато прекрачеше тези по хоризонтала само се прехвърляше на отсрещната страна.


от Flystar (1171 точки)


0
задачите са били почти идентични, но общо взето и моята идея беше такава, само ако оставаше повече време...

от stefan_petrov (256 точки)


1

Здравейте! Знам, че е по глупавия вариант тази задача да се решава с паралелепипед, но все пак си направих труда и по този начин да я направя. Ето моят код. Тук е 2D решението : Tron2D . Благодарности на колегата jivkopavlovski за дискусията!

 


от nikivat (246 точки)


0
Здравей, ако преброиш броя на M на червения са 27 а на синия 28, и се оказва че последния ход направо за червения липсва. Аз затова направих ако свършат ходовете да си продължава в последната посока до сблъсък и стигнах до 75 точки - както и работех с двумерен масив


0
А защо пък трябва да имат еднакъв брой ходове напред?!? Ако проследиш движенията при този вход ще видиш, че играта си завършва, синия се блъска и отговора е RED 7!
Не може ли например синия да се върти в кръг с LLLL и т.н., а червения да върви само напред MMMM и когато червения е минал покрай синия той да направи 1 движение напред и да се блъсне?
B RRRRRRRR
Или пък ако е както са в начална позиция синия само да се върти а червения да се движи само напред и да стане сблъсък между двата автомобила. Изобщо не е задължително двата автомобила да имат еднакъв брой движения напред.

от nikivat (246 точки)



2

Здравей,

използвах твоята идея за разгъването и реших задачата като стигам до 75/100 (останалите 25 са за тестове 9,10,11 и 14, които май все още са грешни в BG coder). За решението използава само масиви и едно уточнение, за което идея даде колегата jivkopavlovski - когато свърши редицата от команди за някой от играчите и играта не е завършила, играча, за който няма повече команди продължава да се движи в посоката, която последно му е зададена (няма го в условието, но иначе не ми се получава дори първия нулев тест).

Това е сорса на програмата: http://pastebin.com/2R3FXist Има няколко Console.WriteLine, които са в коментари, ако се премахнат коментарите може да се види на всеки един цикъл на играта как се променят координатите на двамата играча. По самия алгоритъм няма нищо особено на всяка стъка се чете от реда с командите, докато има смяна на посоката без движение, след което се прави една стъпка напред в текущата посока и се проверява дали играча не е извън полето или във вече посетена от него или другия играч клетка, ако да - губи играта. Ако в един цикъл и двамата играчи изгубят играта имаме равенство. Разстоянието на червения играч накрая се смята лесно - сумата от абсолютните стойности на разликите между началната и крайната стойност на координатите X и Y.

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


от anilak (1134 точки)


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

от stanev.plamen (1143 точки)

0
Задачата действително не е сложна, но аз направих голяма грешка че се захванах с нея на изпита за сметка на 4та която в последствие реших за 40 мин. Много лоша шега ми изигра грешния пример в условието. Пускам получавам 7 отг е 8. Пускам в кодера изкарва ми 9 на същото и почнах да търся под вола теле. И оттам ми тръгна всичко наопаки :(. Ама какво да се прави, такъв е живота. Отделно не съм прочел правилно условието че трябва да са с еднакъв брой М.

от nikivat (246 точки)


0
Подхванах същата задача още вчера и все още не съм я разнищил. На всички други докарах до 100/100, а на тази съм още на 6/100
http://pastebin.com/8DjKy4im
Малко разяснения за начина ми на мислене: 1 - подобно на повечето (или всички) от вас, и аз нямах намерение да се занимавам с тримерен масив. Разгънах куба в булев двумерен масив. Изпозлвах именно булев масив, понеже няма никакво значение дали играча ще се блъсне в своя, или в чужда следа. Ако обаче ще се прави истинска игра, тогава масива трябва да е по-сложен, за да могат различните следи да се оцветят в съответните им цветове. Освен това добавих по едно поле от всяка страна на 'куба', тоест за всеки ръб (включително горе и долу, понеже на картинката е показано как играча се движи и там). 2 - създадох клас "Player" където да съхранявам нужните променливи и да дефинирам методи с които да е по-лесно управлението на въпросния играч. Функцията "ChangeDirection" приема булева стойност, от която се разбира дали да завие наляво, или надясно. Другия метод е "MovePlayer" и се ползва или самостоятелно, или след смяна на посоката. Просто премества едно поле в съответната посока. 3 - добавил съм опция (маркирана като коментар) с която 'играта' може да се вижда в своето действие (2D!!). Не е много красиво, но помага за дебъгване.
Имам няколко неясни момента: - Как точно определяте къде е центъра (началната позиция), ако някоя от страните е четно число? - Ако това се случи по дължината на началните им страни, тогава как решавате в коя посока да са насочени играчите в началото? Ако няма идеален център, тогава едната страна на 'куба' винаги ще е по-близо от обратната.

от lokiko91 (790 точки)


0

Искам да споделя тук решението си за 56 точки. Единствено смятането на дистанцията видях как се прави. Много време ми отнеха тия 56 точки и за сега смятам да премина към друга задача. Ако някой ми забележи грешките ще съм благодарен. http://pastebin.com/w3TQgEB2


от d.brezoev (212 точки)


0
Някой може ли да ми обясни наистина логиката, защото честно не я схващам. Защо на test2 трябва да ми изкара BLUE 0 и защо на test6 трябва да е RED 8 а не RED 7, защото извършените движения са наистина 7. Другите тестове се отказах да ги и гледам. Всичко се движи нормално по програмата, но накрая изкавам само 6 точки и явно не мога да разбера дали условието, дали логиката.

от andrei_pl (247 точки)


0
Това за разстоянието е така, защото в задачата не търсим червеният играч общо колко хода е направил, а търсим манхатаново разстояние, което е кофти в задачата, и то по - краткото манхатаново разстояние. Ето тук има малко информация за манхатаново разстояние : http://en.wiktionary.org/wiki/Manhattan_distance

от mbelev (2312 точки)

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

от andrei_pl (247 точки)


0
Колеги авторското решение което е предоставено на http://telerikacademy.com/Courses/Courses/Details/97 дава exception (IndexOutOfRange) на 46 ред след като въведа първия input example. А в BGCoder дава 100/100. Някой може ли да ми разясни ?



0
Мда, и аз това се чудя. Гърми в случая, когато индекса на командите излезе от масива и продължим да търсим нови команди.

от ivan.mihov1 (4988 точки)


0

 Днес опитах самостоятелно решение на задачата, но взема само 18 точки:

http://pastebin.com/CTG5ejit

 Може ли някой да погледне къде греша?

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


от ivan.mihov1 (4988 точки)


0
Виж коментара по-горе за test 2 ... манхатаново разстояние и т.н. .... предполагам имаш същия казус - на test 2 твоя код дава BLUE 1, вместо BLUE 0

от jokerbg (383 точки)

0

 Уникално. След повече от половин ден загубено време по тази задача - 37 точки.

Ето подобреното решение:

 http://pastebin.com/Bgh2Vf4Q

Гледам авторското решение - 100 точки. Гледам моето - 37. ОК, по друг начин правя движенията, но резултата трябва да е същия. Не откривам и никакъв проблем в това махнатаново разстояние. Хем копирах накрая метода, който смята разстоянията от решението за 100 точки.

 Бих желал да попитам, къде в задачата се упоменава, че като свършат ходовете трябва да останем на последния ход? За мен по-логично е да се завърти от първия, след като не е казано.

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

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


от ivan.mihov1 (4988 точки)