對於N階幻方,從1開始把數字從小到大按以下規則依次寫入:
一、在第一行中間一列寫入1
二、依次向右上方寫入2、3、4......
三、如果某數字寫在了表格的某個方向外面,那就把這個數字向相反方向移動N個單位,把它放入表格內部。例如,某數字
寫在了表格的上方,那就把這個數字向下移動N個單位。
四、如果某個數字的右上方已經被占用,那就把下一個數字寫在這個數字的正下方。
五、如果某個數字位於表格的最右上角,那么下一個數字要寫在這個數字的正下方(例子中16的寫法)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 void nineGongGe( int n){ 5 vector<vector<int>> a(n,vector<int>(n,0)); 6 int x = 0, y = n/2; 7 a[x][y] = 1; 8 for(int i = 2; i<= n*n; ++i){ 9 int xNew = x-1; 10 int yNew = y+1; 11 if(yNew > n-1)//右邊超出邊界往左移 12 yNew = 0; 13 if(xNew < 0)//上邊超出邊界往最下方移 14 xNew = n-1; 15 //如果某個數字的右上方已經被占用,那就把下一個數字寫在這個數字的正下方 16 if(a[xNew][yNew] != 0||(x==0&&y==n-1)){ 17 xNew = x+1; 18 yNew = y; 19 } 20 a[xNew][yNew] = i; 21 x = xNew; 22 y = yNew; 23 } 24 for(int i = 0; i< n; ++i){ 25 for(int j = 0; j < n; ++j){ 26 cout<< a[i][j]<<"\t"; 27 } 28 cout<<endl; 29 } 30 } 31 int main(){ 32 int n; 33 cin>>n; 34 nineGongGe(n); 35 return 0; 36 }