Kuvaldum
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Объясняю с максимальной подробностью Итак: Код: (i < k) && (y != pos[i-1]) && (abs(k-i) != abs(y-pos[i-1])) | Условие цикла, в котором проверяется возможность постановки ферзя в очередной горизонтали доски. Переменные: i - номер очередного проверяемого ферзя из уже расставленных, изменяется от 1 до k-1; k - номер горизонтали, куда ставим очередного ферзя (соответственно, k-1 - количество уже расставленных ферзей); y - вертикаль, куда пытаемся поставить ферзя; pos[] - массив, хранящий вертикали уже расставленных ферзей для каждой горизонтали. Условие состоит из трех кусочков, каждый из которых должен быть выполнен: Код: Это очевидное условие - перебраны все ферзи, ни один нас не бъет. Код: Это проверка, что ферзь не стоит в той же вертикали доски. Отнимание единицы здесь связано с тем, что авторы программы пронумеровали все, начиная с единицы, а массивы в С индексируются с нуля. Код: (abs(k-i) != abs(y-pos[i-1])) | Наименее очевидная проверка, но если вдуматься, все прозрачна. Логически здесь проверяется, не бьет ли нас текущий ферзь по диагонали. Фактически проверяется, что до него совпадают расстояния по горизонтали и вертикали. abs() - модуль, абсолютное значение, проставлено чтобы одновременно проверить оба диагональных направления. Достаточно подробно ? |