奇幻七絕
先填上行正中央,
依次斜填切莫忘。
上格沒有頂格填,
頂格沒有底格放。
轉載於: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;
- }