acm奇数魔方阵

奇数魔方阵

(输入文件:input.txt 输出文件:output.txt

魔方矩阵是一个n*n奇数矩阵,其中n^2个元素分别是1,2,3,4,5…,n^2。魔方矩阵的特点是:任意一行、任意一列以及主副对角线的所有数之和均相等,且都等于n(n^2+1)/2,如下图所示的三阶魔方矩阵

816
357
492

小明已经研究出摆放矩阵中数字规则如下:

1、数字1在矩阵第一行中间一列;

2、从数字2n^2的各个数依次存放在前一个数的又上角的位置、

3、若上一个数在第一行,下一个数在最后一行,若上一个数在最后一列,下一个数字第一列。

4、按上述规则放置,如果已经有数了就放在上一个数的正下方。

数据输入:

输入有多个数据,每个数据n占一行(n<21,并且n是奇数)。

数据输出:

对应每个输入数据,输出对应的魔方矩阵。

样例输入:

5

3

样例输出:

 17 24  1  8 15
 23  5  7 14 16
  4  6 13 20 22
 10 12 19 21  3
 11 18 25  2  9
  8  1  6
  3  5  7
  4  9  2
分析:其实解题思路很简单按照给出的规则对二维数组进行填写后输出就可以了!
#include"stdio.h"
#include"fstream"
#include"iostream"
using namespace std;
//ifstream fin("input.txt");
//ofstream fout("output.txt");
int main()
{
	int a[21][21] = {0};			
	int n;
	freopen("input.txt", "r", stdin);	//修改输入指向
	freopen("output.txt", "w", stdout); //修改输出指向
	while ((cin >> n)&&n!=EOF)		//多组数据,判断输入是否到了文件末尾
	{
		int i = 0,j = n / 2 ;		//i j,分别表示数字的行和列
		for (int r = 1; r <= n*n; r++)
		{
			
			if (a[i][j] == 0)		//如果等于0表示该位置没有数字
			{
				a[i][j] = r;		
			}
			else                    //表示该位置已经有数字,于是填写在上一个数字的下方
			{
				i = (i + 2) % n;				//%n以保证不会超出界限
				j = j == 0 ? n - 1 : j - 1;		//定为到上一个数字的下方
				a[i][j] = r;					//填写数字
			}
				i = i==0 ? n - 1 : i - 1;		//定为下一次的位置
				j = (j +1) % n;			//%n以保证不会超出界限

		}
		for (i = 0; i < n; i++)				//打印二维表
		{
			for (j = 0; j < n; j++)
			{
				printf("%3d", a[i][j]);
				a[i][j] = 0;			//赋值为0保证下一组数据的正确执行
			}
			cout << endl;
		}
	}
//	system("pause");
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值