Проблема с ферзями с использованием рекурсии с возвратом

Я работал над проблемой 8 ферзей, но застрял. Мне не нужен код. Я хотел бы получить советы и указания, чтобы понять, как решить эту проблему самостоятельно, используя рекурсию с возвратом.

Программа должна перечислить все решения проблемы N-ферзей, нарисовав расположение ферзей в ASCII, как два решения здесь.

Мой псевдокод пока что:

void queen(int n){

   for( int i = 0; i < n; i++){

       place queen[ i ] on row i;

       for(int j = 0 ; j < n ; j++){
               if( queen[ i ] is not in the same column as queen[0] through queen[ i - 1 ]  &&
                   queen[ i ] is not on the same major diagonal with queen[0] through queen[ i -1 ]  &&
                   queen[ i ] is not on the same minor diagonal with queen[0] through queen[ i -1 ]  ) {
                              print 'Q ';
                   }
               else{
                              print '* ';
                   }

               System.out.println();
         }

         System.out.println();

  }

}

В моем псевдокоде нет рекурсии с возвратом, потому что я не знаю, как это сделать.

Любая помощь приветствуется. Без кода, пожалуйста.

(Обновление в ответ на Nemo):

solver(int n, Board b){
    for(int i = 0; i < b.length; i++){
       place queen in column i;
       for(int j = 0; j < b.length; j++){
           change b;
           solver(n+1,changed b); 
       }
    }
}

Это правильно?

(Обновление 2):

 solver8(board /* with queens presented in first 7 columns */){
    // place a queen in the 8th column;
    for(each possible placement of the queen in column 8 
        or in other words int i = 0; i < board.length; i++ ){
             place the queen and print the board
    }
}


 solver7(board /* with queens presented in first 6 columns */){
    // place a queen in the 7th column;
    for(each possible placement of the queen in column 7 
        or in other words int i = 0; i < board.length; i++ ){
             solver8(board with queens placed in first 7 columns);
    }
}


 solver6(board /* with queens presented in first 5 columns */ ){
    // place a queen in the 6th column;
    for(each possible placement of the queen in column 6 
        or in other words int i = 0; i < board.length; i++ ){
             solver7(board with queens presented in first 6 columns);
    }
}

и так до тех пор, пока

 solver1(1, empty board){
     for(int i = 0; i < board.length; i++){
        place queen in row[i] of column 1;
        solver2(board with queen in row[i] of column 1);
      }
}

Обновление 3 (отредактировано):

private int numberOfQueens = 8;
solver(int n, Board b){

        for(int r = 0; r < b.length; r++){

               place queen in row[r] of column[n];

               if(n == numberOfQueens){
                    print the board;
                    return;
                }
                else{
                    solver(n+1, board with queen in row[r] of column[n]);
                }
           }
     }
}

person Nath    schedule 14.06.2011    source источник
comment
Это домашнее задание? Если да, пометьте вопрос как таковой. Это может помешать людям предложить вам комплексные решения, которые вам вообще не помогут.   -  person Bertrand Marron    schedule 14.06.2011
comment
+1 за явный запрос, чтобы мы не писали код за вас. :-)   -  person Aasmund Eldhuset    schedule 14.06.2011
comment
@Bertrand: Я бы не сказал, что это домашнее задание, потому что я учусь один.   -  person Nath    schedule 14.06.2011
comment
@ Аасмунд: Да, именно так. Нет кода. Я хочу это понять и сделать сам.   -  person Nath    schedule 14.06.2011
comment
Пара моментов: 1) поищите, что означает рекурсия (не для того, чтобы показаться сопливой). Вы не делаете этого в своем псевдокоде, потому что, короче говоря, вы не вызвали метод Queen из метода Queen. 2) Чтобы решить эту проблему, ваша программа должна будет попробовать множество различных решений, пока не найдет то, что работает. Для этого он не будет ничего распечатывать, пока не найдет решение. Итак, вам понадобится какая-то структура данных, чтобы удерживать проблему в памяти, пока ваша программа работает над ней.   -  person Marvo    schedule 14.06.2011
comment
@Marvo: Я делал разные задачи, связанные с рекурсией, но это первая проблема, связанная с рекурсией с возвратом.   -  person Nath    schedule 14.06.2011
comment
Спасибо всем, кто ответил на мой вопрос. Я рассмотрю все ваши ответы и обязательно вернусь с другими вопросами позже.   -  person Nath    schedule 14.06.2011


Ответы (5)


Цель использования рекурсии для такого рода задач заключается в том, что они позволяют вам думать в терминах «Я разместил k ферзей; как я могу разместить оставшиеся, если общее количество ферзей равно < em> n? " Таким образом, рекурсивная функция должна принимать два параметра: целевое количество ферзей и количество ферзей, размещенных на данный момент. При написании функции ваша цель - в первую очередь опробовать различные способы размещения k ферзя. Но когда вы выбрали возможное размещение и сочли его допустимым, вам нужно разместить оставшиеся n - k - 1 ферзей. Как мы можем это сделать? Ответ: рекурсия! Вызовите функцию (внутри себя) с параметром k - 1, чтобы указать, что вы хотите разместить оставшиеся k - 1 ферзей. Всякий раз, когда вы исчерпываете все возможности (или обнаруживаете, что ни одна из них невозможна), просто вернитесь из функции - тогда вы вернетесь к предыдущему вызову функции (например, к тому, который пытается разместить k -го ферзя) .

Изменить: вам также нужно будет создать двумерный массив для представления текущего состояния вашей доски; этот массив должен быть либо отправлен как дополнительный параметр рекурсивной функции, либо сохранен как поле класса, содержащего метод.

Что касается обратного отслеживания, это достигается просто путем проверки того, что функция, вызываемая с k + 1, удаляет k + 1 -го ферзя с доски перед возвратом; по сути, это означает: «Мы сейчас (безуспешно) испробовали все способы размещения оставшихся ферзей - на основе позиций k ферзей, которые уже были размещены. Ни один из них не увенчался успехом, поэтому, пожалуйста отрегулируйте позиции первых k ферзей (что будет сделано функцией, которая была вызвана с помощью k, и функцией, которая вызвала эту функцию, и т. д.) и попробуйте снова."

person Aasmund Eldhuset    schedule 14.06.2011
comment
Мне нужно будет внимательно просмотреть все ответы. Поскольку я не сталкивался с какими-либо проблемами, связанными с рекурсией с возвратом, я думал, что само по себе отслеживание с возвратом является чем-то сложным для понимания и реализации. - person Nath; 14.06.2011
comment
›› Вам также потребуется создать * двумерный * массив. В этом нет необходимости. вы можете сохранить одномерный массив (каждый индекс поля - это строка, а число в индексе - это столбец, в котором находится королева) - person Op De Cirkel; 14.06.2011
comment
@Nath: Очень понятно. Я предлагаю вам сначала попробовать более простую задачу, чтобы освоиться с этой техникой. Например: учитывая одномерный массив int (скажем, с 10 элементами), как вы можете заполнить его нулями и единицами так, чтобы было не более трех единиц? (например, 0011000001 действителен, а 0011000011 - нет). - person Aasmund Eldhuset; 14.06.2011
comment
@Aasmund Eldhuset: Я пытался найти более простую задачу, чтобы понять рекурсию с возвратом, как вы сказали, но я не смог. Спасибо за ваш пример. Итак, вы имеете в виду, как я мог бы заполнить все элементы массива нулями и единицами, чтобы в каждом заданном элементе массива не было более трех единиц? - person Nath; 14.06.2011
comment
@Nath: Да (предположим, что под всеми элементами массива вы имеете в виду все возможные способы заполнения массива - в конце концов, элементы массива являются отдельными элементами внутри одного массива). Таким образом, результат должен быть {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1} и так далее. Если вы предпочитаете, вы можете сделать это со строками вместо массивов (просто помните, что с точки зрения производительности добавление к строке является дорогостоящим). - person Aasmund Eldhuset; 14.06.2011
comment
@Aasmund Eldhuset: На самом деле под всеми элементами я имел в виду элементы от array [0] до array [9]. Например, array[0] = 0000000000, array[1] = 0000000001, array[2] = 0000000010 и так далее. - person Nath; 14.06.2011
comment
@Nath: Ах, вы думали, что результатом будет массив строк или массив массивов - тогда да. (Однако результатов больше 10; на самом деле должно быть 176 возможных способов разместить не более трех, если я правильно понял комбинаторику ...) - person Aasmund Eldhuset; 14.06.2011
comment
@Aasmund Eldhuset: Я думал об использовании одномерного массива int. Прошу прощения за недоразумение, но сейчас я немного запутался. Вы хотите, чтобы я заполнил элементы одномерного массива разными комбинациями нулей и единиц, учитывая, что в каждой комбинации не может быть больше трех единиц? Правильно? И я должен сделать это, используя рекурсию с возвратом? - person Nath; 15.06.2011
comment
@Nath: Извините за поздний ответ. Да; используйте одномерный массив int с десятью элементами. Каждый элемент должен содержать 0 или 1 (так array[0] == 0 или array[0] == 1, array[1] == 0 или array[1] == 1, и так далее до array[9] == 0 или array[9] == 1). Как вы говорите, цель состоит в том, чтобы создать все возможные способы заполнения массива, чтобы в нем было не более трех элементов, содержащих 1. - person Aasmund Eldhuset; 16.06.2011
comment
@Nath: подход обратного отслеживания будет заключаться в наличии рекурсивной функции, которая принимает массив в качестве параметра вместе с int i, который сообщает, какой элемент мы пытаемся заполнить прямо сейчас. Если i == 10, это означает, что все элементы массива заполнены, и текущее содержимое массива является допустимым решением и может быть распечатано (а затем функция вернется). В противном случае позвольте array[i] = 0 и вызовите функцию рекурсивно с i + 1. Когда рекурсивный вызов возвращается, вы знаете, что были изучены все возможные способы заполнения оставшейся части массива. - person Aasmund Eldhuset; 16.06.2011
comment
@Nath: После этого проверьте, не содержат ли элементы массива слева от i менее трех единиц; если это так, мы можем поместить единицу в позицию i и снова рекурсивно вызвать функцию, чтобы попробовать все возможности для оставшейся части массива. - person Aasmund Eldhuset; 16.06.2011
comment
Я тоже прошу прощения за поздний ответ :) Я посмотрю, что я могу сделать сам, и вернусь с другими вопросами ... - person Nath; 17.06.2011

Вообще говоря, рекурсивный поиск с возвратом выглядит примерно так:

// On input, s represents a valid State up to depth d-1
sub do_it(int d, State s)
    if (d == MAX_DEPTH+1)
        // State s represents an answer!  Print it and return.
    else
        (augment s to make it valid for depth d)
        for each augmented_s
            do_it(d+1, augmented_s)
        end for
    end if
end sub

// top level
do_it(0, empty_state)

Обратите внимание, что для заданного s, действительного до глубины d-1, может быть несколько способов увеличить его до состояния, действительного до глубины d. Идея состоит в том, чтобы назвать себя с каждым из них.

Для этой задачи «состояние» - это плата. Глубина «d-1» может означать, что первые столбцы d-1 заполнены. Допустимыми расширенными состояниями будут те, у которых королева в столбце d не может быть захвачена.

[Обновить]

Вот еще один способ взглянуть на это. Поработайте над проблемой в обратном направлении.

Предположим, я прошу вас написать простую функцию с именем solver8(). Эта функция принимает в качестве входных данных доску с ферзями, уже присутствующими в первых 7 столбцах. Все, что ему нужно сделать, это взять эту доску, найти все способы добавить ферзя в 8-й столбец и распечатать эти доски. Как вы думаете, вы могли бы написать эту функцию? Хорошо; Напиши это.

Теперь предположим, что я прошу вас написать почти такую ​​же простую функцию под названием solver7(). Эта функция принимает в качестве входных данных доску с ферзями, уже присутствующими в первых 6 столбцах. Все, что ему нужно сделать, это взять эту доску, найти все способы добавить ферзя в 7-й столбец и передать каждую из этих досок в качестве аргумента solver8(). Не могли бы вы написать эту функцию?

Теперь предположим, что я прошу вас написать еще одну функцию с именем solver6(). В качестве входных данных используется доска с ферзями в первых 5 столбцах. Все, что ему нужно сделать, это взять эту доску, найти все способы добавить ферзя в 6-й столбец и затем передать каждую из этих досок в solver7().

И так далее, пока не дойдем до solver1(). Он берет пустую доску, находит все способы разместить ферзя в первом столбце и передает каждую из этих досок solver2().

Вы только что написали 8 функций, которые вместе решают задачу 8 ферзей. Если это не имеет смысла, запишите это как 8 функций и смотрите на них, пока не поймете.

Теперь, если вы посмотрите на все эти функции, вы обнаружите, что они очень похожи. Поэтому вместо того, чтобы писать solver8, solver7, solver6, ..., solver1, вы пишете одну функцию:

solver(int n, Board b)

... такой, что решатель (1, b) совпадает с solver1 (b), solver (2, b) совпадает с solver2 (b), ..., а решатель (8, b) совпадает с solver8 (б). И вместо вызова solver2 (...), например, solver3 (...), у вас будет просто solver (2, ...), вызывающий solver (3, ...). Одна функция вместо 8, но делает то же самое.

Вы довольно быстро обнаружите, что окончательный код будет чище, если вы начнете с solver9(), который просто берет полностью заполненную доску и распечатывает ее, и solver8() это вызывает.

person Nemo    schedule 14.06.2011
comment
@Nemo: Не могли бы вы дать мне более простой пример, где я могу попробовать указанный выше псевдокод? - person Nath; 15.06.2011
comment
@Nemo: Мне сложно понять рекурсию с возвратом. - person Nath; 15.06.2011
comment
@Nath: я добавил обновление с попыткой другого объяснения. Дайте мне знать, что вы думаете. - person Nemo; 15.06.2011
comment
@Nemo: Большое спасибо за ваш ответ. В моей голове становится немного чище. Я написал еще один псевдокод. Не могли бы вы взглянуть на это в моем обновленном посте и сообщить, правильно ли оно отражает ваше объяснение? - person Nath; 15.06.2011
comment
@Nath: Извините, но это не то ... Каждый solver () должен иметь только один цикл. Я действительно думаю, что вам следует начать с того, чтобы забыть о рекурсивной версии и записать ее в виде 8 отдельных функций, как я описываю. solver6 (например) не нужно перебирать какие-либо столбцы; он должен предположить, что первые 5 столбцов уже заполнены, и его единственная задача - поместить ферзя в 6-й столбец и вызвать метод solver7 (). Он вызывает solver7 () один раз для каждого возможного размещения ферзя в 6-м столбце. Вот и все. - person Nemo; 15.06.2011
comment
@Nath: Я отредактировал ваше второе обновление, чтобы оно было больше похоже на то, что я имею в виду ... Надеюсь, что все в порядке - person Nemo; 16.06.2011
comment
@Nemo: Совершенно верно. Думаю, теперь я понимаю, что вы имели в виду. Теперь позвольте мне попробовать сделать рекурсивную версию. - person Nath; 16.06.2011
comment
@Nemo: Я пытался сделать рекурсивную версию (пожалуйста, см. Обновление 3) того, что вы объяснили мне ранее, но у меня такое чувство, что это не то, что должно быть ... - person Nath; 16.06.2011
comment
Вы все еще используете вложенные циклы for. В правильной версии нет вложенных циклов ... Посмотрите, сможете ли вы понять, как написать решатель с двумя аргументами (N, b), такой, что solver (1, b) совпадает с solver1 (b), solver ( 2, б) совпадает с solver2 (б) и так далее ... - person Nemo; 16.06.2011
comment
@Nemo: Прошу прощения за поздний ответ. Я удалил внешний цикл (см. Отредактированное Обновление 3). Мне сложно понять, как написать рекурсивный решатель с двумя аргументами (N, b), потому что, насколько я понял, мы помещаем ферзя в solver1 () и solver8 (), в то время как ферзь не помещается в solver2 (), solver3 (), solver4 (), solver5 (), solver6 () и solver7 (). Я правильно понимаю? - person Nath; 17.06.2011
comment
Все 8 решателей должны поставить ферзя. solver1 () помещает ферзя в column1. solver2 () помещает ферзя в столбец 2. solver3 () помещает ферзя в столбец 3 и т. д. - person Nemo; 17.06.2011
comment
В таком случае последнее обновление должно быть правильным (я его немного отредактировал), за исключением того, что нет возврата и проверки правильности положения ферзя ... Или нет? - person Nath; 17.06.2011
comment
@Nemo: Если я предполагаю, что псевдокод в обновлении 3 верен, как я могу включить процесс отслеживания с возвратом? - person Nath; 17.06.2011
comment
@Nemo: IMHO ваш псевдокод, выполняет только рекурсию, но не возвращает. Вам нужно сбросить состояние после возврата из функции do_it в цикле for. - person Divick; 04.01.2015

См. Эту красивую анимацию здесь, на 8 queen's problem using recursion.

Также посетите: 8 queens problem - Java/C++.

Ознакомьтесь с объяснениями logic здесь.

person Saurabh Gokhale    schedule 14.06.2011

Поместите первого ферзя в [0] [0], затем найдите место для второго. скажем, вы нашли один переход к следующему и так далее и тому подобное. Предположительно, ваша 5-я ферзь не может быть размещена где-либо в 5-м столбце или строке (в зависимости от того, что вы выберете). Вернитесь к 4-му и найдите другое место для этого. Затем перейдите к 5-му еще раз. Допустим, вы находитесь в 8-м и нет свободных мест. Идите к 7-му, а там все еще ничего. Вы будете продолжать возвращаться до 2-го числа, снова найдете место для 2-го и перейдете к 3-му. Имеет ли это смысл...

person Community    schedule 14.06.2011

Надеюсь, это решение поможет

Основные моменты

1. Рекурсия просто в под

2. IsValid position 2.1 кросс-ферзь находится в том же столбце, что и

*
*

2.2 крест Королева, найденная по диагонали

*--
---
--*

or

--*
---
*--

Код:

package queenproblem;

public class QueenProblem
    {
        int numQueens[];// hold columns postion
        int numQueen;

        QueenProblem(int noOfQueens) {
            this.numQueen = noOfQueens;
            numQueens = new int[noOfQueens];

        }

        public static void main(String[] args) {
            new QueenProblem(8).solveProblem();

        }

        public void solveProblem() {
            arrange(0);
        }

        // recursive Function
        void arrange(int rowIndex) {
            // 1.to check valid Postion of not.
            // 2. to check all Queens postion is found or not.
            for (int i = 0; i < numQueen; i++)
            {
                if (isValid(rowIndex, i))
                {
                    numQueens[rowIndex] = i;// save col index

                    if (rowIndex == numQueen - 1)
                    {
                        printsBoard();
                    } else
                    {
                        arrange(rowIndex + 1);

                    }

                }
            }

        }

        private void printsBoard() {
            for (int i = 0; i < numQueen; i++)
            {
                for (int j = 0; j < numQueen; j++)
                {
                    if (numQueens[i] == j)
                    {
                        System.out.print(" * ");
                    } else System.out.print(" - ");
                }
                System.out.println();
            }
            System.out.println();

        }

        boolean isValid(int rowIndex, int colIndex) {

            for (int i = 0; i < rowIndex; i++)
            {
                // on the save columns
                if (numQueens[i] == colIndex) return false;

                if ((i - rowIndex) == (numQueens[i] - colIndex)) return false;
                if ((i - rowIndex) == (colIndex - numQueens[i])) return false;

            }

            return true;
        }
    }

92 Возможные решения проблемы 8 ферзей:

 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 

 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 

 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 

 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 

 -  -  -  -  -  -  *  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  -  -  *  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  *  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  -  *  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  -  * 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  -  * 
 -  -  -  -  -  *  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  *  -  -  - 

 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  -  -  -  * 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 
 -  -  -  -  -  *  -  - 

 -  -  -  -  -  -  -  * 
 -  -  *  -  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  *  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  *  -  -  -  - 

 -  -  -  -  -  -  -  * 
 -  -  -  *  -  -  -  - 
 *  -  -  -  -  -  -  - 
 -  -  *  -  -  -  -  - 
 -  -  -  -  -  *  -  - 
 -  *  -  -  -  -  -  - 
 -  -  -  -  -  -  *  - 
 -  -  -  -  *  -  -  - 
person jatin Goyal    schedule 06.12.2015
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. - person JAL; 06.12.2015