java基礎演算法 n階幻方的實現

2021-08-19 11:30:22 字數 3237 閱讀 6149

說到幻方,很多人可能還不知道什麼是幻方。幻方是一種將一些連續的正整數安排在正方形格仔中,使每行、列和對角線上的數字和都相等的方法。因為正方形格仔可能是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 現依...