解题思路:
    一,因为要多组数据,除了动态分配内存,可以用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;
}
点赞(5)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论