25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1074 Въведение в програмирането със C#<br />

Задача 1: Квадратна матрица<br />

По дадено число N (въвежда се от клавиатурата) да се генерира и отпечата<br />

квадратна матрица, съдържаща числата от 0 до N 2 -1, разположени като<br />

спирала, започваща от центъра на матрицата и движеща се по<br />

часовниковата стрелка, тръгвайки в началото надолу (вж. примерите).<br />

Примерен резултат при N=3 и N=4:<br />

Решение на задачата<br />

От условието лесно се вижда, че имаме поставена алгоритмична задача.<br />

Основната част от решението на задачата е да измислим подходящ<br />

алгоритъм за запълване на клетките на квадратна матрица по описания<br />

начин. Ще покажем на читателя типичните разсъждения, необходими за<br />

решаването на този конкретен проблем.<br />

Да започнем с избора на структура от данни за представяне на<br />

матрицата. Удобно е да имаме директен достъп до всеки елемент на<br />

матрицата, затова ще се спрем на двумерен масив matrix от целочислен<br />

тип. При стартирането на програмата прочитаме от стандартния вход<br />

размерността n на матрицата и я инициализираме по следния начин:<br />

int[,] matrix = new int[n,n];<br />

Измисляне на идея за решение<br />

Следващата стъпка е да измислим идеята на алгоритъма, който ще<br />

имплементираме. Трябва да запълним матрицата с числата от 0 до N 2 -1 и<br />

веднага съобразяваме, че това може да стане с помощта на цикъл, който на<br />

всяка итерация поставя едно от числата в предназначената за него клетка<br />

на матрицата. Текущата позиция ще представяме чрез целочислените<br />

променливи positionX и positionY – двете координати на позицията. Да<br />

приемем, че знаем началната позиция – тази, на която трябва да поставим<br />

първото число. По този начин задачата се свежда до намиране на метод за<br />

определяне на всяка следваща позиция, на която трябва да бъде поставено<br />

число – това е нашата главна подзадача.<br />

Подходът за определяне на следващата позиция спрямо текущата е<br />

следният: търсим строга закономерност на промяната на индексите при<br />

спираловидното движение по клетките. Започваме от най-очевидното нещо<br />

– движението винаги е по посока на часовниковата стрелка, като

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!