C# Fundamentals 2011/2012 Part 2 - Test Exam - Ex.4 3D Lines


9

Условие:

You are given a rectangular cuboid of size W (width), H (height) and D (depth) consisting of W * H * D
cubes, each colored in some color. Each color is denoted by a unique capital letter from the Latin
alphabet: 'Y' is yellow, 'R' is red, 'B' is blue, 'G' green, etc.
Two cubes are neighbors when they share a common side, common edge or common point. A 3D line is
a sequence of neighbor cubes in the same color staying on the same horizontal, vertical, or diagonal in
the cuboid.

Your task is to write a program that finds the length of the longest 3D line and how many 3D lines with

 
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. The colors of
the cubes in the cuboid are given as D sequences of exactly W letters in the next H lines. Each sequence
of W letters is separated from the next one with a single space.
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.
In the first line of the output print the length of the longest 3D line in the cuboid followed by a space
and how many 3D lines with this length exist in the cuboid. If no lines exist in the cuboid print "-1" at
the first line of the output.


Constraints

    The numbers W, H and D are all integers in the range [1…50].
    The letter sequence in the input consists of capital Latin latters only
    Allowed work time for your program: 0.3 seconds.
    Allowed memory: 32 MB.

Решение:

GitHub

Обяснение:

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

1. Дифинираме всички възможно посоки, в който може да има линия. За по-лесно разбиране съм ги разделил и визуализирал, катo към всяка от тях ще дам кординати с който се променя позицията на всяка клетка. Кoординатите ще са във формат - { ширина, височина, дълбочина }:

1.1 Първа група - нека условно ги наречем "тези на тавана" :D

  • Посока в Червено: { 1, 0, 0 }
  • Посока в Оранжево: { 0, 0, 1 }
  • Посока в Жълто: { 1, 0, 1  }
  • Посока в Зелено: { -1, 0, 1 }

1.2. Втора група - нека условно ги наречем "странични" посоки:

  • Посока в Синьо - { 0, 1, 0 }
  • Посока в Зелено - { 0, 1, -1 }
  • Посока в Лилаво - { 0, 1, 1 }

  • Посока в Червено - {1, -1, 0}
  • Посока в Зелено - {1, 1, 0}

1.3. Посоки който са вътре в куба - те са малко по сложно т.к. по-трудно мога да ги визуализирам - тук съм показал две:

  • Посоката в Зелено - { 1, -1, -1}
  • Посоката в Червено - { -1, -1, -1}
  • И още 2 посоки, които не съм визуализирал - {1, -1, 1}, {1, 1, -1}

Сле като сме описали всички посоки вече си съставяме необходимите методи и логика:

1. static char[, ,] ReadLine() ( сега като се замисля съм кръстил доста глупвао :D ) - прочита входа и го преобразува под формата на масив.

2. static bool isPassable(char[, ,] myCube, int w, int h, int d) - проверява дали дадени координати се намират в рамките на даден масив - ако дa връща true, ако не false

3. Какво прая в Main() ? - за всяка клетка правя следната операция:

3.1 Записвам си стойността на конкретната клетка в - char curChar = cube[w, h, d];

3.2. Чрез for цъкъл обикалям по всички масиви с посоки и прибавям тяхната стойност към определената клетка докато не изляза от масива.

3.3. Ако текущата клета има стойност като началата клетка увеличавам дължианта на моята линия с 1, ако не break; - вам цикъла.

3.4. Накрая проверявам дали дъжлината на линията ми е равна на най-голямата дължиан до сега, ако е така увеличавам боря на линиите с еднаква дължина с 1. Също така проверявам дали дължината на текущата линия по-голяма от най-голямата до сега линия и ако е я презаписвам и насторойвам борча на еднакви линии на 1.

3.5. Принтирам резулатата.

 

Осъзнавам, че има и по-добри и оптимални решения, но това успях да направя аз и дава 100/100 :)

Въпрос/Предизвикателство - Някой може ли да познае какво не съм направил и защо не съм го наравил :) ?




Отговори



1

Въпрос/Предизвикателство - Някой може ли да познае какво не съм направил и защо не съм го наравил :)

Ххахахах и аз направих първо това ... :D :D :D Надявах се дадат някакви точки, но всъщност се почувствах по-щастлив, че го няма :D :D :D

http://pastebin.com/SZM6bGXB

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


от vlad0 (6103 точки)


0
Хихи и при мен бе така :D ! Да видим дали някой друг ще се сети за какво става въпрос :D

от Teodor92 (13062 точки)


1

Да не би да сте пробвали да печатите само "-1" . Ако е това слава богу че дава никави точки laugh

За обяснението с посоките на мен ми се струва, че визираш всички съседни клетки на текущата(не само залепените със стена да стена съседи , а и тези които са под ъгъл), надявам се да не съм го изтълкувала погрешно, защото тепърва ще я решавам задачката.


от atodorova (1273 точки)


0
Точно това е :D и т.к. не даде никакви точки въобще не се занимавах да добавям такава функционалност :D Относно за посоките - тези който са под ъгъл са тези който са вътре в куба - общо 4, но съм визуализирал само 2 т.к. са малко трудни за начертаване :)

от Teodor92 (13062 точки)


0

Здравейте,

Да не отварям нова тема, искам да попитам за тази задача.

Решение : 

Изкарвам 40 точки и мисля, че грешката е в посоките, но ми се струват правилни.

Може би съм сложил повече случаи от колкото трябва


от tddhome (3086 точки)


0
Здравей, Теодоре.

Може ли да дадеш решението на задачата отново? Линка, който си поставил по-горе, не е активен.

Благодаря.

от Stanislavstt (10 точки)


0
https://github.com/Teodor92/TelerikAcademy/tree/master/CSharp/002.%20CSharpTestExamPartTwo/06.%203DLines

от Teodor92 (13062 точки)

0
Мерси!
Много бърз отговор :)

от Stanislavstt (10 точки)