Алгоритм перебора магического квадрата

В основном для назначения мне нужно создать программу на C#, которая будет принимать число в качестве входных данных (n), а затем создавать двумерный массив размером n * n с номерами от 1 до (n * n). Нужно использовать метод грубой силы. Я сделал это, но в данный момент программа просто случайным образом генерирует порядок чисел каждый раз, поэтому иногда она проверяет один и тот же порядок более одного раза. Очевидно, это означает, что для проверки любого числа, превышающего 3, требуется очень много времени, и даже для 3 это может занять несколько минут. По сути, мне интересно, есть ли способ сделать так, чтобы он проверял каждый заказ только один раз. Мне разрешено использовать только "базовые" функции C#, поэтому просто такие вещи, как *, /, +, - и ничего похожего на.Shuffle и т. Д.

2 ответа

Позвольте мне убедиться, что я понимаю вопрос: вы хотите перечислить все перестановки чисел от 1 до n в квадрате и проверить, дает ли перестановка магический квадрат. Теперь вы генерируете случайные перестановки, но вместо этого вы хотите сгенерировать все перестановки.

Я написал серию статей о генерации перестановок; это слишком долго, чтобы легко подвести итог здесь.

http://ericlippert.com/2013/04/15/producing-permutations-part-one/

Выбор случайного порядка, как вы обнаружили, не очень хорошая идея.

Я предлагаю вам поместить все числа 1 ... (n*n) в массив, а затем найти все перестановки.

когда у вас есть все перестановки, легко создать квадрат (1 .. n ==> первая строка, n+1 ... 2n ==> вторая строка и т. д.).

Теперь найти всю перестановку можно с помощью базовой операции с рекурсией

Другие вопросы по тегам