Продължавам с решения на задачите от изминали изпити, този път ще обясня накратко решението на Задача 3 – KukataIsDancing! от изпита от миналия сезон на Академията на11.02.2013 година.
Условието може да намерите тук: bgcoder.com/Contest/DownloadTask/337
1. Инициализира си куба в един двумерен масив, в случая нямаме нужда от тримерен тъй като Куката танцува само по повърхността на куба. Задаваме на всяко поле съответния цвят спрямо условието.
2. Четем си броя на танците, дефинираме си 3 променлива: currentIndexX и currentIndexY, в която ще пазим индексите на текущото поле в което се намира Куката и currentDirection, в която ще пазим посоката в която се движим, по +x, -x, +y или -y;
3. Пускаме си един цикъл от 0 до броя на танците, всеки ден ще започва от зеленото поле, съответно винаги ще стартираме от поле в куба на позиция [1,1].
4. Логиката, която аз имплементирам е следната, когато currentDirection е равно на 0, ще се движим в посока +x, когато е 1 или -3, ще се движим в посока +y, когато е 2 или -2, в посока -x, и когато е 3 или -1, в посока -y;
Като стойността на currentDirection ще се променя само когато посоките на нашия танц са L или R, при което трябва да променим посоката на движение. Като на всяка стъпка трябва да се застраховаме че текущата стойност на currentDirection не е по-голяма от 3 или по-малка от -3, ако текущата посока на движение става +x, а именно currentDirection = 0;
5. Когато символа от нашия текущ танц е ‘W’ в съответствия от посоката в която трябва да се движим съответно увеличаваме или намаляваме currentIndexX или currentIndexY, и тъй като Куката може да преминава от една стена на куба към друга негова стена, трябва да добавим условие при което никога да не излезнем от границите на нашия куб. А това става по следния начин, Ако текущия индекс по Х е по-голям от 2, преминаваме на нова стена от куба и следователно текущия индекс по Х става равен на 0, същото важи и за Y, А пък ако се движим в противоположната посока, ако текущия индекс по Х е по-малък от 0, отново преминаваме на друга страна на куба и следователно текущия индеск на Х става равен на 2, същото важи и за У.
6. След като сме прочели всички символи от текущия танц, принтираме на конзолата, цвета на полето в което се намира Куката след завършването на неговия танц.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; class KukataIsDancing { static void Main() { string[,] cube = new string[3, 3]; cube[0, 0] = "RED"; cube[0, 2] = "RED"; cube[2, 0] = "RED"; cube[2, 2] = "RED"; cube[0, 1] = "BLUE"; cube[1, 0] = "BLUE"; cube[1, 2] = "BLUE"; cube[2, 1] = "BLUE"; cube[1, 1] = "GREEN"; int number = int.Parse(Console.ReadLine()); int currentIndexX = 1; int currentIndexY = 1; int currentDirection = 0; for (int i = 0; i < number; i++) { string text = Console.ReadLine(); currentIndexX = 1; currentIndexY = 1; for (int j = 0; j < text.Length; j++) { switch (text[j]) { case 'L': currentDirection += 1; if (currentDirection > 3) { currentDirection = 0; } break; case 'R': currentDirection -= 1; if (currentDirection < -3) { currentDirection = 0; } break; case 'W': if (currentDirection == 0) { currentIndexX += 1; } else if (currentDirection == 1 || currentDirection == -3) { currentIndexY += 1; } else if (currentDirection == 2 || currentDirection == -2) { currentIndexX -= 1; } else if (currentDirection == 3 || currentDirection == -1) { currentIndexY -= 1; } break; } if (currentIndexX > 2) { currentIndexX = 0; } else if (currentIndexX < 0) { currentIndexX = 2; } if (currentIndexY > 2) { currentIndexY = 0; } else if (currentIndexY < 0) { currentIndexY = 2; } } Console.WriteLine(cube[currentIndexX, currentIndexY]); } } }