Я бы подумал о том, чтобы принять во внимание, что большинство решений - это не что иное, как зеркальные или повернутые версии других решений. Например, вам не нужно пытаться поставить первую ферзь в каждом столбце слева направо. Вероятно, достаточно, если вы идете только слева направо. Это уже сократило бы время вдвое. Если я не ошибаюсь, то для доски 8x8, например, размещение ферзя в 7-м столбце даст тот же набор результатов, что и во 2-м столбце, только перевернутый. Почему бы и нет?
Решение проблемы экспоненциальной сложности: Если честно, 20 ферзей на доске 20х20 создают такое огромное дерево, что я не думаю, что есть какая-либо оптимизация, способная дать вам точный результат в разумные сроки. Я только что посмотрел, и есть почти 40 миллиардов решений для n = 20. См. oeis.org / A000170 - n = 20 имеет примерно в 17 тысяч раз больше решений, чем n = 15. Я не думаю, что мы можем оптимизировать ваш алгоритм по этому фактору. Таким образом, даже если мы приложили все усилия и получили всего 2 секунды для n = 15 ... это все равно означает почти 10 часов для n = 20.
Вы также можете думать об этом таким образом. Если существует 39 029 188 884 решений для платы 20х20 с 20 ферзями, то сколько это будет? Чтобы запомнить каждое решение, вам нужно сохранить 20 чисел от 1 до 20 (горизонтальная позиция или координата x каждой ферзя). Вам нужно 5 бит, чтобы представить число <20, следовательно, 5 * 20 = 100 бит для каждого решения. 100 бит раз 39 029 188 884 означает 3634 гигабайта. </p>
И это тот объем данных, который должна сгенерировать ваша программа (я знаю, что вам не нужно сохранять решения, вы просто их подсчитываете, но вам нужно сгенерировать каждое из них, чтобы вы могли поставить галочку) , Ваш учитель не может разумно ожидать, что вы напишете программу, генерирующую 3634 гигабайта значимых данных в одно мгновение.
Существуют способы оценки такого результата - например, случайное распределение ферзей случайным образом и подсчет того, сколько раз вам выпало получить их в положении, удовлетворяющем критериям (никто из них не атакует друг друга); например, 0,0013% раз. Затем умножьте это на (n * n)! / (n * (n-1))! - количество всех возможных конфигураций, и вы получите оценку. Но это только оценка, очевидно. Чем дольше вы их беспорядочно распространяете, тем точнее будет эта оценка.