给定一个奇数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 }

 

posted @ 2019-07-07 11:04  知了会爬树  阅读(1036)  评论(0编辑  收藏  举报