奇幻七绝
先填上行正中央,
依次斜填切莫忘。
上格没有顶格填,
顶格没有底格放。
转载于: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;
- }