本文主要是介绍1053: 奇数幻方,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。幻方也是一种汉族传统游戏。
在《射雕英雄传》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1~9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。这就是一个最简单的3阶平面幻方。因为幻方的智力性和趣味性,很多游戏和玩具都与幻方有关,如捉放曹操、我们平时玩的六面体,也成为学习编程时的常见问题。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式),其中N 为奇数时,所构造的幻方即为奇数幻方,运用罗伯特的楼梯法来构造最为简单,具体方法如下:(1)将1放在第一行中间一列;(2)从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,如向右上;每一个数存放的行比前一个数的行数减1,列数加1;(3)如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列数同样加1;(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
奇数幻方是不是很有趣呢?请你按照上述方法构造出指定奇数的奇数幻方吧!
话不多说看看我的代码!!!!
我用了最简的代码
我的思路都在注释了
然后主要是根据题中的方法写出一个代码,然后判断是不是被覆盖了判断a[x][y]是否等于0,x,y分别为下一个点的横坐标,纵坐标。
#include<stdio.h>
int a[120][120];
int main(void)
{int n;scanf("%d",&n);int x,y,num=0;for(int i=1;i<=n*n;i++){if(i==1){a[1][(n+1)/2]=++num;x=1;y=(n+1)/2;}else{if(x-1>=1&&y+1<=n&&a[x-1][y+1]==0)//第一个条件45度下一个坐标为(x-1,y+1){a[x-1][y+1]=++num;x=x-1;y=y+1; }else if(x-1<1&&y+1<=n&&a[n][y+1]==0)//第二个条件在第一行{a[n][y+1]=++num;x=n;y=y+1; }else if(y+1>n&&x-1>=1&&a[x-1][1]==0)//第三个隐藏条件在最后一列{a[x-1][1]=++num;x=x-1;y=1;}else//所有条件之外{a[x+1][y]=++num;x=x+1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(j!=1)printf(" ");printf("%d",a[i][j]);}if(i!=n)printf("\n");}
}
这篇关于1053: 奇数幻方的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!