class Program
{
static int jie = 5;//这里修改幻方的阶数。3阶秒开,4阶步开,5阶……20分钟还没有出一种结果。
//4阶幻方35秒出了220种结果。
static long c = 0, c1 = 0;
static DateTime beginTime, endTime;
static TimeSpan oTime;
//验证第n行(n为下标)(小验证,为了提高效率)
static bool yanzheng(int[][] x,int n)
{
int s = 0;
for (int i = 0; i < jie; i++)
{
s += x[n][i];
}
if(s == (1 + jie * jie) * jie / 2)
{
return true;
}
else
{
return false;
}
}
//正式验证
static void yanzheng(int[][] x)
{
//debug start
c1++;
if (c1 % 100000000 == 0)
{
// Console.WriteLine("------Not Answer!------");
// for (int i = 0; i < x.Length; i++)
// {
// for (int j = 0; j < x[i].Length; j++)
// {
// Console.Write(x[i][j] + " ");
// }
// Console.WriteLine();
// }
endTime = DateTime.Now; //获取结束时间
oTime = endTime.Subtract(beginTime); //求时间差的函数
//输出运行时间。
Console.WriteLine($"已完成{(int)((float)x[0][0]/(jie*jie+1)*100)}%,运算出{c}种可能,程序的运行时间:{oTime.TotalSeconds} 秒");
//Console.WriteLine("程序的运行时间:{0} 毫秒", oTime.TotalMilliseconds);
}
//debug end
int s = (1 + jie * jie) * jie / 2, t;
for (int i = 0; i < x.Length; i++)
{
t = 0;
for (int j = 0; j < x[i].Length; j++)
{
t += x[i][j];
}
if (t != s)
{
return;
}
}
for (int i = 0; i < x.Length; i++)
{
t = 0;
for (int j = 0; j < x[i].Length; j++)
{
t += x[j][i];
}
if (t != s)
{
return;
}
}
t = 0;
for (int i = 0; i < x.Length; i++)
{
t += x[i][i];
}
if (t != s)
{
return;
}
t = 0;
for (int i = 0; i < x.Length; i++)
{
t += x[i][jie - i - 1];
}
if (t != s)
{
return;
}
c++;
if (c < 10)//打印前10种
{
Console.WriteLine("------" + c + "------");
for (int i = 0; i < x.Length; i++)
{
for (int j = 0; j < x[i].Length; j++)
{
Console.Write(x[i][j] + " ");
}
Console.WriteLine();
}
}
}
//从x里取数向y里放,放第n个(从0开始)
static void put(List<int> x, int[][] y, int n)
{
int t;
for (int i = 1; i < jie; i++)
{
if(n==i*jie)
{
if(!yanzheng(y, i - 1))
{
return;
}
}
}
for (int i = 0; i < x.Count; i++)
{
if (n < jie * jie - 1)
{
y[n / jie][n % jie] = x[i];
t = x[i];
x.RemoveAt(i);
put(x, y, n + 1);
x.Insert(i, t);
}
if (n == (jie * jie - 1))
{
y[jie - 1][jie - 1] = x[i];
yanzheng(y);
}
}
}
static void Main(string[] args)
{
int[][] b = new int[jie][];
var a = new List<int>(jie*jie);
for (int i = 0; i < jie*jie; i++)
{
a.Add(i + 1);
}
for (int i = 0; i < jie; i++)
{
b[i] = new int[jie];
}
beginTime = DateTime.Now; //获取开始时间
put(a, b,0);
Console.WriteLine($"程序结束,共有{c}种方案。");
Console.ReadKey();
}
}