Как известно, магическим квадратом называется квадратная матрица с натуральными числами в ее ячейках, сумма которых по всем строкам, столбцам и диагоналям дает одно и то же значение. Пример на фото
Составьте алгоритм в виде блок-схемы, который бы случайным образом формировал один из вариантов магического квадрата со стороной равной 3. Вероятность появления любого допустимого варианта должна быть одинакова.
Условие алгоритма: доступны только целые числа от 1 до 9, каждая из которых может быть использована только 1 раз.
При создании алгоритма можно использовать математические операции и функцию СЛЧИСЛ (N), которая возвращает целое, случайное число в интервале [1, N].

using System;
namespace Answer {
class Program {
static void Main() {
var magic = new Magic();
if (magic.BruteForce()) Console.WriteLine(magic);
Console.ReadKey();
}
}
class Magic {
private const int n = 3;
private readonly int[,] matrix = new int[n, n]{
{ 1, 2, 3},
{ 4, 5, 6},
{ 7, 8, 9},
};
private readonly Random rand = new Random();
private bool Coincidence() {
int row;
int col;
var sum = 0;
for (int i = 0, j; i < n; ++i) {
row = 0;
col = 0;
for (j = 0; j < n; ++j) {
row += matrix[i, j];
col += matrix[j, i];
}
if (row > 24 || col > 24) Console.WriteLine("Bad!");
if (row != col) return false;
else if (i == 0) sum = row;
else if (sum != row) return false;
}
var md = 0;
var sd = 0;
for (int i = 0, j = n - 1; i < n; ++i, --j) {
md += matrix[i, i];
sd += matrix[i, j];
}
return md == sd && sd == sum;
}
private void Rearrange() {
var ai = rand.Next(0, 3);
var aj = rand.Next(0, 3);
var bi = rand.Next(0, 3);
var bj = rand.Next(0, 3);
Swap(ref matrix[ai, aj], ref matrix[bi, bj]);
}
private void Swap(ref int a, ref int b) {
if (a != b) {
var tmp = a;
a = b;
b = tmp;
}
}
public bool BruteForce() {
do Rearrange(); while (!Coincidence());
return true;
}
public override string ToString() {
var format = "";
for (var i = 0; i < n; ++i) {
for (var j = 0; j < n; ++j) {
format += $" {matrix[i, j]} ";
}
format += "\n\n";
}
return format;
}
}
}