C语言:幻方问题

[问题]幻方又称魔方阵,游戏规则是在一一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。

在这里插入图片描述
[想法]解决幻方问题的方法很多,下面介绍一种“左上斜行法”的填数方法,该方法适用于任意奇数阶幻方,具体填数
过程如下:
(1)由1开始填数,将1放在第1行的中间位置;
(2)将幻方想象成上下、左右相接,每次往左上角走一一步,会有下列情况:
①左上角超出上边界,则在最下边对应的位置填入下一个数,如图(a)所示;
②左上角超出左边界,则在最右边对应的位置填入下一个数,如图 (b)所示;
③按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数,如图 ©所示:
在这里插入图片描述

代码部分:

/*1.幻方问题*/
	int arr[100][100]={0};    //假设最多为100行、100列 
	printf("请输入1-100内的奇数:\n");   //只处理为奇数的方阵 
	int num;
	scanf("%d",&num);
	int i,j;
	i=0;j=num/2;   
	arr[i][j]=1;  //将第一个值存入中间位置 
	int iTemp,jTemp;  //用于暂存当前位置 
	for(int k=2;k<=num*num;k++){
		iTemp=i;
		jTemp=j;
		if(--i<0){  //判断当前位置是否超出上边界 
			i=num-1;
		}
		if(--j<0){  //判断当前位置是否超出左边界 
			j=num-1;
		}
		if(arr[i][j]>0){  //如果该位置已经有数,则在该位置下面添加数字 
			i=iTemp+1;
			if(i==num){
				i=0;
			}
			j=jTemp;;
		}
		arr[i][j]=k;
	}
	for(int m=0;m<num;m++){
		for(int n=0;n<num;n++){
			printf("%d\t",arr[m][n]);
		}
		printf("\n");
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值