对于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]<<" "; 27 } 28 cout<<endl; 29 } 30 } 31 int main(){ 32 int n; 33 cin>>n; 34 nineGongGe(n); 35 return 0; 36 }