奇幻七绝
先填上行正中央,
依次斜填切莫忘。
上格没有顶格填,
顶格没有底格放。
转载于:http://blog.csdn.net/fengchaokobe/article/details/7437767
编程实现奇数阶幻方算法:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n;
do
{
cout << "Please input a odd num:" << endl;
cin>>n;
} while (!(n%2));
int i;
int **Matr=new int*[n];//动态分配二维数组
for(i=0; i<n; ++i)
Matr[i]=new int[n];//动态分配二维数组
//j=n/2代表首行中间数作为起点,即1所在位置
int j=n/2, num=1;//初始值
i=0;
while(num!=n*n+1)
{
int ii = (i%n+n)%n;//注意i%n可能为负数
int jj = (j%n+n)%n;
//往右上角延升,若超出则用%转移到左下角
Matr[ii][jj]=num;
//斜行的长度和n是相等的,超出则转至下一斜行
if(num%n==0)//以n个数一组斜对角填,填满了则又从最后一个数的正下方开始填
i++;
else
{
i--;
j++;
}
num++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;++j)
cout<<setw((int)log10((double)n*n)+4)<<Matr[i][j];//格式控制
cout<<endl<<endl;//格式控制
}
for(i=0;i<n;++i)
delete []Matr[i];
return 1;
}