解题思路:
一,因为要多组数据,除了动态分配内存,可以用STL中的vector容器来实现
二,(百度百科)传统魔方阵的排列规律如下:
⑴将1放在第一行中间一列
⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面。
注意事项:
1,这道题是把传统幻方倒着输出的,比如第一行放在最后一行,第二行在倒数第二行. . . ,只需要在最后输出的时候把行倒叙输出即可。
2,最后输出的时候应该保持与题目数位一致,每个数字向右对齐
3, 输入的都是奇数
参考代码:
#include<iostream> #include<vector>//vector的头文件 using namespace std; int main() { int n; while (cin >> n&&n) { vector<vector<int>> a(n, std::vector<int>(n, 0));//定义一个二维数组,并赋每个初值为0 int i = 0, j = n / 2, m, v; for (int t = 1; t <= n * n; t++)//n*n个数字依次填到数组里面 { if (a[i][j] == 0) //如果等于0,则说明此位置还未填入数字 { a[i][j] = t; m = i; v = j; //用m和v来记录本次填入的位置给下次使用 } else //若此位置已填入数字,则进行上述解题思路中的二(5)方法 { i = m + 1; //先将j的值换为上次位置+1,即上个数字的下一行 j = v; //列不变 a[i][j] = t; } if (i == 0) i = n - 1;//若已经是第一行,则下个数字存放在最后一行,解题思路二(3) else i--; if (j == n - 1) j = 0; //解题思路二(4) else j++; } for (int p = n-1; p >=0; p--)//倒序输出 { for (int q = 0; q <= n - 1; q++) { //保持数位相同,3以内的n平方最大的数字是9,3-9,n平方最大时81二位数,11-29.n方最大三位数 if (n <= 3) printf("%d ", a[p][q]); else if (n <= 9) printf("%2d ", a[p][q]); else printf("%3d ", a[p][q]); } cout << endl;//每一行输出完后输出一个换行符 } cout << endl; } return 0; }
0.0分
21 人评分