幻方也加魔方,通俗点就是N*N的方格中,填入1~n^2个数,使得横坚斜的和都相同。大家最熟悉的应该就是九宫格的3阶了。这儿我只和大家分享一下奇数阶的;因为奇数阶的就只有一个规律,偶数阶的稍微有点复杂(其实我只会4阶,还是从射雕英雄传里面学来的,在写这篇博客的时候我也特地去百度了一下,发现偶数阶的好像不同的阶数规律不一样,所以这儿 就只和大家说说偶数阶的了)。
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
17 | 24 | 1 | 8 | 15 |
23 | 5 | 7 | 14 | 16 |
4 | 6 | 13 | 20 | 22 |
10 | 12 | 19 | 21 | 3 |
11 | 18 | 25 | 2 | 9 |
<span style="color:#3366ff;">#include<iostream>
#include<iomanip>
using namespace std;
const int N = 9;//定义阶数,当前9阶;该算法只适合奇数阶幻方
int main()
{</span>
<span style="color:#3366ff;"> if(N < 3 || N % 2 == 0)
{
cout << "此算法只适用于奇数阶幻方,且最小为3阶" << endl;
exit(0);
}
int a[N+1][N+1] = {0};//为了方便理解,a[0][0]就没用
int row = 1, col = (N+1)/2;//第一行的最中间的坐标
a[row][col] = 1;//第一行的最中间为 1
for(int i = 2; i <= N * N; i++)//从2开始填入
{
if((i - 1) % N == 0)//如果遇到N的整数倍,则纵坐标不变,横坐标加1
{
row++;
a[row][col] = i;
continue;
}
else if(row == 1)//如果当前在第一行,下一个数的横坐标为N
{
row = N;
col++;//纵坐标加1
a[row][col] = i;
continue;
}
else if(col == N)//如果当前在第N列,下一个数在第一列
{
col = 1;
row--;//横坐标减1
a[row][col] = i;
continue;
}
else//横坐标减1,纵坐标加1 ,即斜向上填入
{
row--;
col++;
a[row][col] = i;
continue;
}
}
for(int i = 1; i <= N; i++)//输出
{
for(int j = 1; j <= N; j++)
cout << setw(2) << a[i][j] << " ";
cout << endl;
}
}</span>