n阶魔方--洛谷AC

题目描述

n为任意奇数,表示方阵的维度。如n=3,则将数字1~9不重复地填在3行3列的9个方格中,分别使得每一行、每一列、两个对角线上的元素之和都等于15。
6 1 8
7 5 3
2 9 4

输入格式

输入一个奇数

输出格式

输出填好数字的方阵,每个数字中间空一格,并且每行、每列、两条对角线的元素相加之和相等。

输入输出样例

在这里插入图片描述

说明/提示

将用做“魔方”的二维数组的所有元素清0;
第一个数填在第一行居中的位置上(i=0,j=n/2);
以后每填一个数后,将位置移到当前位置(i,j)的左上角,即做动作i=i-1,j=j-1;
根据不同情况对位置进行修正:
(1)若位置(i,j)上已经填数,或者i,j同时小于0,将位置修改为i=i+2,j=j+1;
(2)若i小于0,但j不小于0,修改i为n-1;
(3)若j小于0,但i不小于0,修改j为n-1

#include<stdio.h>
#include<stdlib.h>
void mf(int n,int **a)
{
    
    
	int i,j;
	i=0;
	j=n/2;
	a[i][j]=1;
	for(int key=2;key<=n*n;key++)
	{
    
    	
		if(key%n==1)
		{
    
    
			i=i+1;
		}
		else
		{
    
    
			i=i-1;
		    j=j-1;
		}
	/*	if(i<0&&j<0)
		{
			i=i+2;
			j=j+1;
		}*/
		if(i<0&&j>=0)
		{
    
    
			i=n-1;
		}
		if(i>=0&&j<0)
		{
    
    
			j=n-1;
		}
	    a[i][j]=key;
	}
}
int main()
{
    
    
	int **a;
	int key;
	int i,j;
	int n;
	scanf("%d",&n);
	a=(int**)malloc(sizeof(int*)*(n+1));
	for(i=0;i<=n;i++)
	{
    
    
		a[i]=(int*)malloc(sizeof(int)*(n+1));
	}
	for(i=0;i<=n;i++)//数组初始化 
	{
    
    
		for(j=0;j<=n;j++)
		{
    
    
			a[i][j]=0;
		}
	}
	mf(n,a);
	for(i=0;i<n;i++)
	{
    
    
		for(j=0;j<n;j++)
		{
    
    
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_45800653/article/details/107954209
今日推荐