先创建一个每个元素为0的空二维数组,用x和y表示当前所在点的索引值。
然后用斜向法,从起点开始向右上找位置,x--,y++如果位置的索引超出范围要进行修改。
索引值修改完成后检查该位置是否是0,也就是是否已经被填过了。如果没填过就把0改成相应的数字,如果填过了就先回滚到本次循环开始时的x和y值,并且下移一个单位,也就是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 }