博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C语言】二维数组解魔方阵
阅读量:4291 次
发布时间:2019-05-27

本文共 1508 字,大约阅读时间需要 5 分钟。

解题思路:

魔方阵的排列规律如下(思路来自互联网):

注意:刚开始我也没看懂,但是相信我多看几遍理解已经能看懂的。

如3×3的魔方阵: 

    8   1   6 
    3   5   7 
    4   9   2  

(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

小编提示:

魔方阵算法:下个数的位置为上个数的位置的行减一列加一  即x-1 y+1 

通过这个算法即可算出魔方阵。但是需要注意的是有几种情况是不满足的。例如:

x越界:将x置为(总行数-1)

y越界:将(y=0)

如果arr[x][y]有值了。将新的位置置为上个数的后方即arr[oldx+1][oldy];

代码如下(由小编亲自编写,有问题请联系小编微信:eyyjsxy):

#define N 15#include "stdio.h"int main(){	int arr[N][N] = {0};	int x=0,y,s=1,i,j,n=2,oldx,oldy;	//校验输入的是不是偶数或者是不是超过了15位	while(n%2 == 0 || n > 15){		printf("输入n的值,不能是偶数,不能超过15:");		scanf("%d",&n);		}	//计算第一行中间的列值,并将1赋值到这个位置	y=n/2;	//对其赋值并记录其位置,用于下一个数的位置判断	arr[x][y] = s;	oldx = x;	oldy = y;	//从2 到 n*n进行循环,通过上一个值的地址寻找下一个值的地址 例如通过 数字  1 所在的地址 寻找2所在的地址	for(s = 2;s <= n*n;s++){					//进行行减一列加一运算		x = oldx - 1;		y = oldy + 1;				//判断特殊情况		if(x < 0)//x越界			x = n-1; //x越界就将x的位置重置为n-1		if(y > n-1){//y越界			y = 0;//y越界就将y重置为0		}		if(arr[x][y] != 0){			//通过上面的条件判断arr[x][y]位置有数,那么就将新的数加到上个数的下面oldx + 1即可			x = oldx+1;			y = oldy;		}		printf("%d:的位置为(%d,%d):\n",s,x,y);		//经过一些列的判断,一定能得出这个数的位置,我们只需要将s赋值到这个位置即可!		//对其赋值并记录其位置,用于下一个数的位置判断		arr[x][y] = s;		oldx = x;		oldy = y;	}	//循环输出魔方阵	printf("即将输出一个%d*%d的魔方阵:\n",n,n);	for(i = 0;i < n;i++){		for(j = 0;j < n;j++){			printf("%d\t",arr[i][j]);		}		printf("\n\n");	}	return 0;}

效果如图所示: 

3*3:

5*5:

 

转载地址:http://xthgi.baihongyu.com/

你可能感兴趣的文章
java常见的集合及其关系
查看>>
成为出色的程序员必修之路-数据结构(总结)
查看>>
今天被一个架构师面了
查看>>
java学习建议
查看>>
Java传参方式
查看>>
分布式补偿事务处理方案 / 分布式计算是如何控制事务的?
查看>>
分布式定时任务——elastic-job
查看>>
Spring中配置数据源的4种形式(含有如何在spring框架中解决多数据源的问题)
查看>>
分布式与集群有什么区别?
查看>>
linux安全-禁止密码登录及root登录
查看>>
Java 中的类为什么要实现序列化呢 / JAVA中序列化和反序列化中的静态成员问题
查看>>
redis集群搭建及注意事项
查看>>
分布式演变过程中之Session集群解决方案
查看>>
拥有这些Java这些技术可以涨工资吗?
查看>>
MySql学习之Join查询
查看>>
简单介绍线程池在并发编程中的使用
查看>>
redis如何防止并发?
查看>>
无备份情况下恢复MySQL误删的表,这样做再也不用怕误删了
查看>>
MySQL断电恢复的一点简单分析
查看>>
linux进程网络流量监控工具nethogs
查看>>