說到幻方,很多人可能還不知道什麼是幻方。幻方是一種將一些連續的正整數安排在正方形格仔中,使每行、列和對角線上的數字和都相等的方法。因為正方形格仔可能是3*3或者n*n的,所以幻方就有了幾階幻方的說法。需要注意的是幻方最低是3階!
三階幻方 四階幻方
一、 奇數階幻方我採用了最簡單的羅伯法:
1、將最小的數放在第一行最中間
3、如果下乙個數超出了上邊界則放在下邊界,縱座標不變;超出了右邊界則放在左邊界,橫座標不變
二、思考如何將演算法轉換成**
1、如何存放幻方(即如何將存放數字的排列)
陣列作為一種常用的儲存資料的引用型別,其下標還可以很好的方便我們對幻方裡的值進行查詢和修改,所以使用int型別的二維陣列儲存幻方中的數字。
int arr=new int[len][len];//len是幻方的階數
2、如何記錄上乙個數與當前數的座標
arr陣列的下標即可以記錄數字的下標。我們將一系列連續的數存放在陣列中肯定會使用到for迴圈,那麼完全可以使用兩個int值x,y來記錄上個數的下標,然後根據羅伯法對x,y的值進行修改得到正確的當前數的下標
三、**填充
1、定義二位陣列,長度為幻方階數
int arr=new int[len][len];//len是幻方的階數
2、將最小的數num存放在第一行正中間,同時記錄該數的座標
arr[0][len/2]=num;
int x=0;int y=len/2;
3、使用for迴圈存放數字
for(int i=num+1;ips:接下來的**都將在這個for迴圈裡面
4、確定當前數的座標
理想狀態下當前數的座標是x-1,y+1。如果x-1越界,則直接將x賦值為len-1即下邊界;同理,如果y+1越界則直接將y賦值為0即左邊界。
如果當前數的座標已經存放了數字,則找到上乙個數的座標(大家可以自己寫出二位陣列中查詢某個數下標的方法,此處使用getindex(int arr,int num這個方法來表示))然後行數加1,注意此處仍然需要注意x是否越界。同時此處得到的新的座標也有可能存在數字,所以可以放在while迴圈裡。
if(x-1<0)else
if(y+1>arr.length-1)else
while(true)else}}
四、**測試
經測試可以看到,**可以正確實現奇數階幻方
一、雙偶階幻方我使用了對稱交換法:
1、首先將數字按從小到大的順序依次放入正方格中
2、先沿著正方格的一條對角線,將他左半邊的值與其右半邊的值進行交換。另一條對角線操作類似
二、**實現
因為邏輯相對簡單,所以省去中間環節,直接進行**填充
1、定義陣列
int arr=new int [len][len];//len為陣列長度
2、將數字從小到大依次存入
int a=1;
for(int i=0;ifor(int j=0;jarr[i][j]=a;
a++; }
}3、交換對角線的值
for(int i=0;i//交換\方向的對角線左半部和右半部的值,其座標關於len/2,len/2對稱
int num=arr[i][i];
arr[i][i]=arr[len-1-i][len-1-i];
arr[len-1-i][len-1-i]=num;
//交換/方向的對角線左半部和右半部的值,其座標關於len/2,len/2對稱
num=arr[i][len-1-i];
arr[i][len-1-i]=arr[len-1-i][i];
arr[len-1-i][i]=num; }
三、**測試
經測試可以看到,**可以正確實現雙偶階幻方
一、單偶階幻方使用了象限對稱交換法
1、先建立4個長寬只有一半的正方格,即len/2
2、把數字從小到大依次放入這四個正方格中
3、對這四個正方格使用奇數階幻方求法
4、將這四個正方格放到原來的正方格中,數字最小的格仔放在左上角,最大的放在左下角,第二大的放在右上角,第三大的放在右下角
5、n=len/2,將左上角正中間的數及他右邊n-1個數與左下角對應的數交換;將左上角其他行最左邊的n個數與左下角對應的數交換
6、將右上角中間一列開始從左向右共n-1列與右下角交換
二、填充**
1、定義四個長度為len/2的二位陣列,同時使用奇數階幻方求法
int is1 = getsinglearray(len/2,1);
int is2 = getsinglearray(len/2,1+len*len/4);
int is3 = getsinglearray(len/2,1+2*len*len/4);
int is4 = getsinglearray(len/2,1+3*len*len/4);
2、將四個陣列按要求放在乙個len長度的二維陣列中
for(int i=0;ifor(int j=0;jif(iarr[i][j]=is1[i][j];
}else if(i>=len/2&&j>=len/2)else if(i=len/2)else }
}3、將左上角和右上角的數按照需要與左下角和右下角交換
for(int i=0;iif(i==len/4)
}else }
if(len/4-1!=0) }
} }}
三、**測試
經測試可以看到,**可以正確實現單偶階幻方
關於「三階幻方」演算法的Java實現
演算法分析 名稱 三階幻方 題目 試將1 9這9個不同的整數填入乙個3x3的 使每行,每列,以及每條對角線上的數字之和相同。解析思路 要滿足題目中的條件,那麼,數字之和必為15,數字5必定是中間的那個數。1.將剩下的數分為幾組 1,9 2,8 3,7 4,6 在 中,這些數字與中間的數字連線會有對應...
N(奇數)階幻方解法
3階8 1635 7492 5階17241 815235 714164 6132022 1012 1921311 182529 include includeusing namespace std const int n 9 定義階數,當前9階 該演算法只適合奇數階幻方 int main int a...
C語言的N階幻方
關於c語言的n階幻方問題 問題描述 所謂 n 階幻方是 1,2,n2 的方陣排列,且每行 每列和每條對角線上的和都相等。問題舉例 編寫程式列印 5x5 的幻方矩陣 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 現依...