Loading...
kidroca avatar kidroca 117 Точки

Вариант за обхождане на матрици в разлчни посоки чрез един и същ метод* с delegate и lambda expression

Здравейте,

Вчера решавах задачата "Clearing Commands" от Advanced C# Exam Problems Practice в нея според това на каква команда попаднем трябва да обходим даден ред/колона от матрица или хоризонтално (наляво или надясно), или вертикално(нагоре или надолу) и да спрем в даден случеай. Това са 4 посоки.

За всяка посоките може да се напише метод. 

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

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

Няма да се изненадам и да има такъв начин (да се подаде математически оператор, не знакът като char) но аз се сетих за друго - не мога ли да му подам на този метод една ламбда функция която да приема i и да казва какво да става с този i (i++ или i--) и така стигнах до следното решение 

Конкретно за тази задача не е кой знае колко полезно, но за задача която има и диагонални посоки това много лесно може да се осъществи като във lambda функцията се подаде кой индекс да нараства и кой да намалява (или и двата да нарастват/намаляват зависи от диагонала).

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

2
Fundamentals Module 09/10/2015 02:04:37
TonislavAtanasov avatar TonislavAtanasov 86 Точки

На прима виста се сещам за нещо такова (ако правилно съм ти разбрал въпроса):

Всъщност на метода можеш да му подадеш този знак, но по друг начин. Подаваш му параметър, да кажем Х и в цикъла си не увеличаваш с 1, а увеличаваш с Х. По този начин ако подадеш 1 ще нараства, а ако подадеш -1 ще намалява. Така можеш да подаваш и двата параметъра (за двете посоки). Например 1, 0 или 1, -1... сещаш се накъде бия.

Хрумва ми нещо, но не съм го тесвал, а нямам време. Замислих се дали всичко може да стане с един цикъл. Обаче нарастващ и намаляваш for са две различни неща, как да ги напишем с един цикъл? Ами ако ползваме например нещо такова:

Подаваш directionX, directionY (0, 1 или -1) в зависимост накъде искаш да ходиш.
Подаваш и още нещо - променлива която казва дали е нарастващ или намаляващ цикъла (да кажем К, което е 1 или -1)

while (iterator != condition)
{
    // logic
    x += directionX;
    y += directionY;
    iterator += k;
}

Не съм сигурен дали ще е приложимо за тази задача, но ако ми остане време ще го тествам. Ако ти е интересно и имаш време можеш да пробваш дали би се получило.

Поздрави и успех!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.