给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
先来个3*3
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
n奇数幻方口诀:
1. 数字1放在第一行中间
2. 依次放在上一个数的右上角
2.1如果右边出去了就回到左边
2.2 如果上面出去了就放下面
2.3 如果右上角有了就放在这个数的下面
vector<vector<int> > Shudu(int n)
{
vector<vector<int> > ret(n, vector<int>(n, 0));
int i = 0, j = n/2, k = 2;
ret[i][j] = 1;
while(k <= n*n)
{
int tempi = i-1;
int tempj = j+1;
if(tempi < 0)
tempi = n-1;
if(tempj > n-1)
tempj = 0;
if(ret[tempi][tempj] != 0)
{
tempi = i+1;
tempj = j;
}
ret[tempi][tempj] = k;
i = tempi;
j = tempj;
++k;
}
return ret;
}
{
vector<vector<int> > ret(n, vector<int>(n, 0));
int i = 0, j = n/2, k = 2;
ret[i][j] = 1;
while(k <= n*n)
{
int tempi = i-1;
int tempj = j+1;
if(tempi < 0)
tempi = n-1;
if(tempj > n-1)
tempj = 0;
if(ret[tempi][tempj] != 0)
{
tempi = i+1;
tempj = j;
}
ret[tempi][tempj] = k;
i = tempi;
j = tempj;
++k;
}
return ret;
}