百練 神奇的幻方(二維陣列水題)
阿新 • • 發佈:2019-01-24
神奇的幻方
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65535kB
- 描述
-
幻方是一個很神奇的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
-
#include<iostream> #include<cstring> using namespace std; int n; int mp[200][200]; int cnt; int main() { cin>>n; int x,y,nx,ny; x=0;y=(2*n-1)/2; mp[x][y]=++cnt; while(true) { if(cnt==(2*n-1)*(2*n-1))break; int ny=(y+1)%(2*n-1); if(x==0)nx=2*n-2; else nx=x-1; if(x==0&&y==2*n-2){ nx=1;ny=2*n-2; mp[nx][ny]=++cnt; } else if(mp[nx][ny]){ nx=(x+1)%(2*n-1);ny=y; mp[nx][ny]=++cnt; } else mp[nx][ny]=++cnt; x=nx;y=ny; } for(int i=0;i<(2*n-1);i++) { for(int j=0;j<(2*n-1);j++) { if(j==0)cout<<mp[i][j]; else cout<<" "<<mp[i][j]; } cout<<endl; } return 0; }