Въпрос за задача от изпит по C# 2 - Slides


2

You are given a rectangular cuboid of size W (width), H (height) and D (depth) consisting of W * H * D cubes. The top row (layer) of the cube is considered to be with height 0. Each cube can contain one of the following things – slide, teleport, basket or just be an empty cube. A small ball that can fit through a single cube is dropped over the cuboid. The ball can pass through cubes according to some rules and can exit the cuboid only through the bottom side, but not through the walls. Your task is to find if the ball can exit the cuboid and also the coordinates of the final cube that it got to (either before exiting or when stuck somewhere). The elements of the cuboid are given as strings:

  • imageSlide – The ball slides on it to the next level of the cuboid in the given direction. Each slide is given in the following pattern “S X” where X is the direction. The directions are: “L” – left, “R” – right, “F” – front, “B” – back, “FL” – front left, “FR” – front right, “BL” – back left, “BR” – back right. E.g. if the ball is in cube [2, 0, 0] with slide (S BL) it slides to cube[1, 1, 1]. If the ball can’t slide in the given direction (i.e. to a wall), it’s stuck and can’t exit the cuboid. If the ball is on a slide on the last row it is considered that it can slide and exit regardless of the direction.
  • Teleport – Surprisingly the ball gets teleported to another cube on the same row. Each teleport is given in the following pattern “T W D” where “W” and “D” are the width and the depth of the destination cube e.g. (T 1 2) Two teleports will not point to each other.
  • Empty cube – The ball falls through it and goes directly to the next level. It is given as a single letter “E” e.g. (E)
  • Basket – If the ball falls in a basket it’s stuck there and can’t exit. The basket is given as single letter “B” e.g. (B)

Input

The input data should be read from the console. At the first line 3 integers W, H and D are given separated by a space. These numbers specify the width, height and depth of the cuboid. At the next H lines the cubes are given as D sequences of exactly W strings each one in brackets “( )”. Each sequence of W strings is separated from the next one by " | " (space + vertical line + space). At the last line there will be two integer numbers ballW and ballD that specify the location where the ball is initially dropped.

The input data will be correct and there is no need to check it explicitly.

Output

The output data should be printed on the console.

On the first output line you should print “Yes” if the ball can exit the cuboid or “No” otherwise.

On the second line print the 3 coordinates (w, h, d) of the last cube that the ball got to.

Constraints

  • The numbers W, H and D are all integers in the range [3…50].
  • The numbers ballW and ballD specify the indexes in the cuboid array.
  • 0 ≤ ballW < W,   0 ≤ ballD < D

·         Allowed working time for your program: 0.3 seconds. Allowed memory: 16 MB.

Examples

Example input

Example output

3 3 3

(S L)(E)(S L) | (S L)(S R)(S L) | (B)(S F)(S L)

(S B)(S F)(E) | (S B)(S F)(T 1 1)  | (S L)(S R)(B)

(S FL)(S FL)(S FR) | (S FL)(S FL)(S FR) | (S F)(S BR)(S FR)

1 1

Yes

1 2 0

 

Example input

Example output

3 3 3

(S L)(E)(S L) | (S L)(S R)(S L) | (B)(S F)(S L)

(S B)(S R)(E) | (S B)(S F)(T 1 1)  | (S L)(S R)(B)

(S FL)(S FL)(B) | (S FL)(S FL)(S FR) | (S F)(S BR)(S FR)

1 0

Решение: http://pastebin.com/gzm8ryMq

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

Най - вероятно грешката е в мен. Ако може някой да ми разясни ще съм благодарен :)

No

2 2 0

 




Отговори



3

Колега, смени редове 59 и 60 с това:

string[] inputData = input.Split();
int ballW = int.Parse (inputData[0]);
int ballD = int.Parse(inputData[1]);

Дава 70/100, другото гърми с тайм лимит, ще го погледна.

Както ти е кода сега работи само за едноцифрени width и depth.

Edit: вторият и последен проблем е ред 99 - вместо "S BL" си написал "S Bl", малката буква ти върти безкраен цикъл и времето гърми - 100/100 след смяната.


от Drago (711 точки)


0
Много ми помогна :). Не мога да повярвам колко тъпи грешки..

от tddhome (3086 точки)

0
За нищо :) Един съвет - не си "нагаждай" кодът спрямо нулевите тестове, че като стане проблем не можеш да го видиш лесно, защото постоянно сравняваш с техните входни данни. И аз имах подобен проблем при тази задача, но заради еднаквите страни на паралелипеда и ми даваше OutOfRangeException. А просто бях сменил две букви при пълненето на масива. Успех на изпита!

от Drago (711 точки)


2
Колега, не ти е от това грешката. Конзолата чете до 255 символа, затова bgcoder, пренасочва входните и изходните данни към текстов файл. Вариант за дебъгване е, да си вкараш входните данни в един string и след това да си го обработваш.

от Hristo.B (3885 точки)


0
+1. И аз наскоро се сблъсках с това ограничение (всъщност са 254 символа, + 2 за новия ред). Имаше начин да се избегне като се смени STDIN с Console.SetIn(...).

от staafl (5770 точки)


7

Можеш да използваш StreamReader file = new StreamReader(@"..\..\text.txt"), за да си прочетеш входа, като text.txt съдържа командите и посоките, а размерите на куба и началните позиции на топката си ги въвеждаш от клавиатурата. Ето малко код: http://pastebin.com/mLy7pzrJ


от teleriknetwork (2734 точки)


1
Когато тази задача се решаваше на workshopa входа се четеше аналогично. Без текстови файлове и резултата беше 100 точки.

от tddhome (3086 точки)


1

За да не отварям нова тема, пиша тук. Имам подобен проблем със задачата - изкарва грешни отговори на 3 от тестовете. Ще съм благодарна, ако някой погледне решението ми:

https://github.com/plamena/TelerikAcademy/blob/master/Exam%20prep%20C%23%20part2/CSharpPart2_ExamPrep_2013_v1/03.Slides/Slides.cs


от PlamenaG (10 точки)


0
Здравей, Мисля че е проблема ти е проверката if (ballH == height - 1 && command != "B") { ballExitedTheCube = true; break; } Ако си на клетка height – 1 и имаш телепорт не излизаш автоматично, затова добавяш if (ballH >= height - 1 && command != "B" && command[0] != 'T') { ballExitedTheCube = true; break; } И излизаш на следващата итерация. Мисля че така ще е ОК

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

0
Много благодаря:) Това е била грешката.

от PlamenaG (10 точки)


0

Някой ако може да помогне, дава ми 10/100 в BGcoder-а и 2 дни вече не мога да открия какво не е наред. Безкрайно ще съм благодарен!!

http://pastebin.com/E4UEyueW


от teodor_k (5 точки)


2
И аз срещнах нерешим (за мен) проблем с тази задача. Получавам 25 т в BGCoder и съобщение за NullReferenceException на останалите тестове. Ще бъда благодарен на малко помощ, защото решението ми отне 2 часа, а неуспешното дебъгване вече доста по-дълго. Неприятният момент е също и че на нулевите тестове няма грешка и затова не мога да дебъгвам с тест, който дава грешка, за да я намеря:http://pastebin.com/9eEUu3QB

от stoianpp (415 точки)


0

GitHub

Ето едно решение - постарах се да е с повече методи и коментари за да е по-ясно.


от dzhenko (3893 точки)