柚子


私信TA

用户名:2201986113

访问量:13730

签 名:

2201986113

等  级
排  名 1292
经  验 3001
参赛次数 0
文章发表 22
年  龄 17
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:

解题思路:
    一,因为要多组数据,除了动态分配内存,可以用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 人评分

  评论区

  • «
  • »