C++_学习笔记_奇数幻方

先创建一个每个元素为0的空二维数组,用xy表示当前所在点的索引值。

然后用斜向法,从起点开始向右上找位置,x--y++如果位置的索引超出范围要进行修改。

索引值修改完成后检查该位置是否是0,也就是是否已经被填过了。如果没填过就把0改成相应的数字,如果填过了就先回滚到本次循环开始时的xy值,并且下移一个单位,也就是x++。然后填数字。

循环完成后把幻方打印出来。

代码及测试结果如下:

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 void showMS(vector<vector<int>> v) {
 6     //用来打印幻方的方法
 7     int length = v.size();
 8     cout << "-";
 9     for (int i = 0; i < length; i++) {
10         cout << "----";
11     }
12     cout << endl;
13     for (int i = 0; i < length; i++) {
14         for (int j = 0; j < length; j++) {
15             cout << "|";
16             cout.width(3);
17             cout << v[i][j];
18         }
19         cout << "|" << endl<<"-";
20         for (int k = 0; k < length; k++) {
21             cout << "----";
22         }
23         cout << endl;
24     }
25 }
26 
27 vector<vector<int>> makeEmptyMS(int n) {
28     //用来创建一个大小为n*n的空幻方的方法
29     vector<int> temp;
30     vector<vector<int>> x;
31     for (int i = 0; i < n; i++) {
32         temp.push_back(0);
33     }
34     for (int i = 0; i < n; i++) {
35         x.push_back(temp);
36     }
37     return x;
38 }
39 
40 vector<vector<int>> makeMS(vector<vector<int>> &v) {
41     //对空幻方进行填值的方法
42     int length = v.size();
43     int mid = length/2;//幻方中间行/列的索引值
44     int x = 0,y=mid;//第一个元素的索引值
45     v[x][y] = 1;
46     for (int i = 2; i < length * length+1; i++) {
47         int temp_x = x;
48         int temp_y = y;
49         x--;
50         y++;
51         if (x < 0)
52             x = length - 1;
53         if (y > length - 1)
54             y = 0;
55         if (v[x][y] == 0) {
56             v[x][y] = i;
57         }
58         else {
59             x=temp_x;
60             y=temp_y;//回滚
61             x++;
62             if (x < 0)
63                 x = length - 1;
64             if (y > length - 1)
65                 y = 0;
66             v[x][y] = i;
67         }
68     }
69     return v;
70 }
71 int main() {
72     cout.setf(std::ios::left);
73     vector<vector<int>> a;
74     int n;
75     cout << "input the size of magicSquare:" << endl;
76     cin >> n;
77     a = makeEmptyMS(n);
78     a = makeMS(a);
79     showMS(a);
80 }

 

 

 

posted @ 2020-04-19 17:40  vantablack  阅读(569)  评论(0编辑  收藏  举报