幻方(Magic Square)是一種將數字安排在正方形格子中,使每行、列和對角線上的數字和都相等的方法。
幻方也是一種中國傳統遊戲。舊時在官府、學堂多見。它是將從一到若干個數的自然數排成縱橫各為若干個數的正方形,使在同一行、同一列和同一對角線上的幾個數的和都相等。
幻方(OEIS中的數列A006052)的數目還沒有得到解決。
基本介紹
種類
完全幻方
乘幻方
高次幻方
n個數的和相等。例子:(三階幻方,幻和為15,)
4 | 9 | 2 |
3 | 5 | 7 |
8 | 1 | 6 |
反幻方
反幻方
多種反幻方三階幻方
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
起源記載
《周易本義》中的《洛書》,一個三階幻方
杜勒的《憂鬱》,內含四階幻方歷史發展


紀錄
幻方欣賞
12階幻方構造原理
4 | 9 | 2 |
3 | 5 | 7 |
8 | 1 | 6 |
#include"stdio.h"#include"math.h"int a[256][256];int sum;int check();void ins(int n);void main(){ int i,j,n,k,t,p,x; scanf("%d",&n); sum=(n*n+1)*n/2; if(n%2==1) //奇數幻方 ins(n); if(n%4==2) { //單偶數幻方 k=n/2; ins(k); for(i=0; i<k; i++) for(j=0; j<k; j++){ a[i][j+k]=a[i][j]+2*k*k; a[i+k][j]=a[i][j]+3*k*k; a[i+k][j+k]=a[i][j]+k*k; } t=(n-2)/4; for(i=0; i<k; i++) for(j=0; j<k; j++){ if((j<t)&&(i<t)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if((j<t)&&(i>k-t-1)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if(j>1&&j<=t){ p=a[i][j+k]; a[i][j+k]=a[i+k][j+k]; a[i+k][j+k]=p; } } } if(n%4==0) { //雙偶數幻方 x=1; for(i=0; i<n; i++) for(j=0; j<n; j++) a[i][j]=x++; for(i=0; i<n; i++) for(j=0; j<n; j++){ if(i%4==0&&abs(i-j)%4==0) for(k=0; k<4; k++) a[i+k][j+k]=n*n-a[i+k][j+k]+1; else if(i%4==3&&(i+j)%4==3) for(k=0; k<4; k++) a[i-k][j+k]=n*n-a[i-k][j+k]+1; } } if(check(n)==1){ for(i=0; i<n; i++){ for(j=0; j<n; j++) printf("%5d",a[i][j]); printf("\n"); } } } int check(int n) { //檢驗是否是幻方 int i,j,sum1=0,sum2; for(i=0; i<n; i++){ for(j=0; j<n; j++) sum1+=a[i][j]; if(sum1!=sum) return 0; sum1=0; } for(i=0; i<n; i++){ for(j=0; j<n; j++) sum1+=a[i][j]; if(sum1!=sum) return 0; sum1=0; } for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){ sum1+=a[i][j]; sum2+=a[i][n-j-1]; } if(sum1!=sum) return 0; if(sum2!=sum) return 0; else return 1;}void ins(int n) { //單偶數幻方的輸入 int x,y,m; x=0; y=n/2; for(m=1; m<=n*n; m++){ a[x][y]=m; if(m%n!=0){ x--; y++; if(x<0) x=x+n; if(y==n) y=n-y; } else{ x++; if(x==n) x=x-n; } }}#include"stdio.h"#include"math.h"int a[256][256];int sum;int check();void ins(int n);void main(){ int i,j,n,k,t,p,x; scanf("%d",&n); sum=(n*n+1)*n/2; if(n%2==1) //奇數幻方 ins(n); if(n%4==2) { //單偶數幻方 k=n/2; ins(k); for(i=0; i<k; i++) for(j=0; j<k; j++){ a[i][j+k]=a[i][j]+2*k*k; a[i+k][j]=a[i][j]+3*k*k; a[i+k][j+k]=a[i][j]+k*k; } t=(n-2)/4; for(i=0; i<k; i++) for(j=0; j<k; j++){ if((j<t)&&(i<t)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if((j<t)&&(i>k-t-1)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){ p=a[i][j]; a[i][j]=a[i+k][j]; a[i+k][j]=p; } if(j>1&&j<=t){ p=a[i][j+k]; a[i][j+k]=a[i+k][j+k]; a[i+k][j+k]=p; } } } if(n%4==0) { //雙偶數幻方 x=1; for(i=0; i<n; i++) for(j=0; j<n; j++) a[i][j]=x++; for(i=0; i<n; i++) for(j=0; j<n; j++){ if(i%4==0&&abs(i-j)%4==0) for(k=0; k<4; k++) a[i+k][j+k]=n*n-a[i+k][j+k]+1; else if(i%4==3&&(i+j)%4==3) for(k=0; k<4; k++) a[i-k][j+k]=n*n-a[i-k][j+k]+1; } } if(check(n)==1){ for(i=0; i<n; i++){ for(j=0; j<n; j++) printf("%5d",a[i][j]); printf("\n"); } } } int check(int n) { //檢驗是否是幻方 int i,j,sum1=0,sum2; for(i=0; i<n; i++){ for(j=0; j<n; j++) sum1+=a[i][j]; if(sum1!=sum) return 0; sum1=0; } for(i=0; i<n; i++){ for(j=0; j<n; j++) sum1+=a[i][j]; if(sum1!=sum) return 0; sum1=0; } for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){ sum1+=a[i][j]; sum2+=a[i][n-j-1]; } if(sum1!=sum) return 0; if(sum2!=sum) return 0; else return 1;}void ins(int n) { //單偶數幻方的輸入 int x,y,m; x=0; y=n/2; for(m=1; m<=n*n; m++){ a[x][y]=m; if(m%n!=0){ x--; y++; if(x<0) x=x+n; if(y==n) y=n-y; } else{ x++; if(x==n) x=x-n; } }}#include<iostream.h>#include<iomanip.h>int main(){ int n,i=0,j=0,a[100][100],tot=0; cout<<"請輸入4的倍數"<<endl; cin>>n; for(i=0;i<n;i++) for(j=0; j<n; j++){ a[i][j]=++tot; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ if(i%4==j%4||i%4+j%4==3) a[i][j]=n*n+1-a[i][j]; } } for(i=0; i<n; i++){ for(j=0; j<n; j++){ cout<<setw(4)<<a[i][j]; } cout<<endl; } return 0;}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 |
23 | 6 | 19 | 2 | 15 |
10 | 18 | 1 | 14 | 22 |
17 | 5 | 13 | 21 | 9 |
4 | 12 | 25 | 8 | 16 |
11 | 24 | 7 | 20 | 3 |
程式編寫
錯位補角
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 |
1 | 2 | 3 | 4 | 5 | ||||
6 | 7 | 8 | 9 | 10 | ||||
11 | 12 | 13 | 14 | 15 | ||||
16 | 17 | 18 | 19 | 20 | ||||
21 | 22 | 23 | 24 | 25 |
4 | 5 | 1 | 2 | 3 |
10 | 6 | 7 | 8 | 9 |
11 | 12 | 13 | 14 | 15 |
17 | 18 | 19 | 20 | 16 |
23 | 24 | 25 | 21 | 22 |
3 | ||||
2 | 9 | |||
1 | 8 | 15 | ||
5 | 7 | 14 | 16 | |
4 | 6 | 13 | 20 | 22 |
10 | 12 | 19 | 21 | |
11 | 18 | 25 | ||
17 | 24 | |||
23 |
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 |

