[模拟]7-10 奇数阶魔阵 (25分)
对于每一个正整数奇数n,输出一个n X n矩阵(奇数阶魔阵), 矩阵元素由1~n平方整数组成, 矩阵的每一行之和、每一列之和、主对角线之和均相等。提示:奇数阶魔阵填数顺序为1填在第一行中间,把矩阵折起来,看成上下相连、左右相连,后续数填在前一个数右上角位置(未填过时)或同一列下一行。本题最好使用动态存储分配。
输入格式:
正整数奇数n
输出格式:
阵列中整数占5位,每个矩阵后空一行,即每个矩阵输出后需要额外输出一个换行字符,最后一行尾部包含2个换行字符。
输入样例:
7
输出样例:
在这里给出相应的输出。例如:
30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20
思路:模拟题意,需要注意几个边界点,比如最右上角的点和左下角的点
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int main() 5 { 6 int n, a, b, tmp, tmp_a, tmp_b; 7 cin >> n; 8 9 vector<vector<int>>v(n, vector<int>(n)); 10 v[0][(n - 1) / 2] = 1; 11 a = 0; 12 b = (n - 1) / 2; 13 tmp = 1; 14 for (int i = 0; i < n*n - 1; i++) 15 { 16 tmp_a = a; 17 tmp_b = b; 18 if (a == 0 && b == n - 1) 19 { 20 a = n - 1; 21 b = 0; 22 } 23 if (a - 1 < 0) 24 { 25 a = n - 1; 26 b = b + 1; 27 } 28 else if (b + 1 == n) 29 { 30 a = a - 1; 31 b = 0; 32 } 33 else 34 { 35 a = a - 1; 36 b = b + 1; 37 } 38 if (v[a][b] == 0) 39 v[a][b] = ++tmp; 40 else 41 { 42 v[tmp_a + 1][tmp_b] = ++tmp; 43 a = tmp_a + 1; 44 b = tmp_b; 45 } 46 47 48 } 49 for (int i = 0; i < n; i++) 50 { 51 for (int j = 0; j < v[i].size() - 1; j++) 52 { 53 printf("%5d", v[i][j]); 54 } 55 printf("%5d\n", v[i][v[i].size() - 1]); 56 } 57 printf("\n"); 58 }