22:神奇的幻方 (從OPENJUDGE引入) 查看
描述 幻方是一個很神奇的N*N矩陣,它的每行、每列與對角線,加起來的數字和都是相同的。 我們可以通過以下方法構建一個幻方。(階數為奇數) 1.第一個數字寫在第一行的中間 2.下一個數字,都寫在上一個數字的右上方: a.如果該數字在第一行,則下一個數字寫在最后一行,列數為該數字的右一列 b.如果該數字在最后一列,則下一個數字寫在第一列,行數為該數字的上一行 c.如果該數字在右上角,或者該數字的右上方已有數字,則下一個數字寫在該數字的下方
輸入 一個數字N(N<=20) 輸出 按上方法構造的2N-1 * 2N-1的幻方 樣例輸入 3 樣例輸出 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
題目分析: 幻方的構造題目已經給出,難點在于當右上角有數時的情況。判斷有無數的方法就是將數組歸零,元素若為“0”則無數,之后將兩種情況分類討論。
程序樣例:
#include<cstdio>int main(){ int N,hf[41][41]={},tot=1; //tot為計數單位 scanf("%d",&N); N=2*N-1; //構造(2N-1)*(2N-1)的幻方 int i=1,j=(N-1)/2; while(tot<=N*N) //遍歷每一個元素 { int m,n; m=i-1>=0? i-1:N-1; n=j; if(!hf[m][n]) //無數 { hf[m][n]=tot; i--; j++; } else //有數 { m=i+1; //降一排 if(m>=N) m=0; n--; //退一列 if(n<0) n=N-1; hf[m][n]=tot; i++; } if(i<0) i=N-1; if(j>=N) j=0; tot++; } for(int i=0;i<N;i++) { if(i) //換行符格式控制新聞熱點
疑難解答