C语言练习14---奇数魔方阵

N为奇数时

(1) 将1放在第一行中间一列;

(2) 从2开始直到n×n止各数依次按下列规则存放:

按 45°方向行走,如向右上

每一个数存放的行比前一个数的行数减1,列数加1

(3) 如果行列范围超出矩阵范围,则回绕。

例如1在第1行,则2应放在最下一行,列数同样减1;

(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,

则把下一个数放在上一个数的下面。

 这为百度百科的解释,说人话就是

1  永远在第一行的中间 ;

其余的数是 下一个数在上一个数所在行的行-1,所在列的列+1;

若行越界则为底行,若列越界则为首列;

若此位置没有数,则可正常填入,否则填入上一个数所在列的下一行的位置


#include <stdio.h>
#include <stdlib.h>

#define ROW 3
#define COS 3

void Magic(int(*arr)[COS])
{
	int row = 0;
	int cos = COS / 2;
	arr[row][cos] = 1;

	for (int i = 2; i <=ROW*COS; i++)
	{
		if (arr[(row - 1 + ROW) % ROW][(cos + 1) % COS] == 0)
		{
			row = (row - 1 + ROW) % ROW;
			cos = (cos + 1) % COS;
		}
		else
		{
			row = (row + 1 + ROW) % ROW;
			cos = cos;
		}
		arr[row][cos] = i;
	}

	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COS; j++)
		{
			printf("%-5d", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n");

}

int main()
{
	int arr[ROW][COS] = { 0 };
	Magic(arr);
	system("pause");
	return 0;
}

3*3 

5*5 

 

对上述这块稍微解析一下

这个条件用于判断填入的位置是否为空

首先我们要先确定填入的位置,才能去判断

那我们怎么确定填入的位置呢?

举个例子吧,当我们要填入2时,

1 所在位置没有上一行,下一个数所填的行,为底行,那我们就不难发现只要 行变为负时,其所在行   为  底行

自然我们就能想到%取模运算符

arr[(row - 1 + ROW) % ROW]

当row-1 为负数时,其结果为ROW-1,就变为底行

当row-1 为正数时,其结果为row-1,其为上一行

这样就有效的避免了 行 下越界的问题

同理:可解决 列 右越界的问题

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值