給定一個奇數n,比如n=3,生成1到n平方的數,如1到9,填入九宮格,使得橫豎斜的和都相等。


對於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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM