Luoyoooo

与其感慨路难行,不如马上出发

[模拟]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 }

 

 

 

  

posted @ 2020-02-04 21:56  Luoyoooo  阅读(384)  评论(0编辑  收藏  举报