天天看点

#c N宫格-横竖斜的和相等

#c N宫格-横竖斜的和相等

要求

一个n阶n×n的矩阵,由数字1,2,⋯,n×n 构成,且满足每一行、每一列、两条对角线的数的和都相等。例如以下是一个3阶的。

816

357

492

它满足:

每一行的和都是15:8+1+6=15、3+5+7=15、4+9+2=15

每一列的和都是15: 8+3+4=15、1+5+9=15、6+7+2=15

两条对角线的和也是15:8+5+2=15、4+9+2=15。

话不多说直接上代码!!!

#include<stdio.h>
int main()
{
	int n;
	int k[40][40] = { 0 }; // 幻方的矩阵
	scanf("%d", &n);
	int b = n / 2 + 1, a = 1, c, d;
	for (int i = 1; i <= n * n; i++) {
		if (i == 1) {
			k[a][b] = 1;
			continue;
		}
		c = a, d = b,a--, b++;
		if (a < 1)a = n;
		if (b > n)b = 1;
		if (k[a][b] == 0)k[a][b] = i;
		else {
			a = c, b = d;
			a++;
			k[a][b] = i;
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			printf("%d", k[i][j]);
			printf("%c", j == n ? '\n' : ' ');
		}
	}
	return 0;
}

           

分析思路

1.首行中间位置填入1。

2.设前一次在x行y列处填入a。如果x-1行、y+1列(即右上一格)还没填入数字,则在该位置填入a+1。否则,在x+1行、y列(即下方一格)位置填入a+1。注意,如果x-1超出上边界,则变成最后一行,即实现循环减1。对y+1操作同理。

3.重复步骤2,直到填入n×n。

流程图如下

#c N宫格-横竖斜的和相等

ps:小白一只如有不对请指正!谢谢!

继续阅读