1 奇數階幻方構造法
?(1) 將1放在第一行中間一列;
?(2) 從2開始直到n×n止各數依次按下列規則存放:按 45°方向行走,向右上,即每一個數存放的行比前一個數的行數減1,列數加1
?(3) 如果行列范圍超出矩陣范圍,則回繞。例如1在第1行,則2應放在最下一行,列數同樣加1;
?(4) 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。


#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0xffffffff #define MAX 1005 #define Temp 1000000000 #define MOD 1000000007using namespace std;int Map[MAX][MAX];void MagicSquare(int n) {Map[1][(n+1)/2]=1;//首先填第一行中間列 1int x=1,y=(n+1)/2;for(int i=2;i<=n*n;i++){if(x==1 && y==n)//若當前位置為(1,n)則下一個數填到當前數字下方 {x=x+1;y=y;Map[x][y]=i;continue;}if(y==n)//若超出邊界則回繞 {if(Map[x-1][1]==-1){x=x-1;y=1;Map[x][y]=i;}else{x=x+1;Map[x][y]=i;}continue;}if(x==1)//若超出邊界則回繞 {if(Map[n][y+1]==-1){x=n;y=y+1;Map[x][y]=i;}else{x=x+1;Map[x][y]=i;}continue;}else//向右上方填 {if(Map[x-1][y+1]!=-1)//若右上方已有數字,當前數字填當前位置下方 {x=x+1;y=y;Map[x][y]=i;}else{x=x-1;y=y+1;Map[x][y]=i;}continue;}} }int main() {int n;while(scanf("%d",&n)!=EOF){memset(Map,-1,sizeof(Map));MagicSquare(n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d%c",Map[i][j],j==n?'\n':' ');}}}return 0; }
?