- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
魔方阵实现的方法
(1)当n为奇数时,即n=2*m+1时,算法为:首先,把1填在第一行的正中间。其次,若数k填在第i行第j列的格子中,那么k+1应填在它的左上方,即i-1,j-1;如果左上方没有格子,若i-1=0,那么k+1填在第n行第j-1列的格子中;若j-1=0,那么k+1填在第i-1行第n列的格子中 ;若i-1=0,j-1=0,那么k+1填在第n行第n列的格子中。再次,若按上述方法找到的格子都已经填过了数,那么,数k+1填在第k个数的正下方。具体实现时:用i0,j0表明格子不存在。找到的格子都已经填过了数的这类数有个特点,那就是可以整除n,即k%n=0。(2)当n为双偶数时,即n=2*2*m时,算法为:将所要求的魔方阵分为上下左右4个n/2*n/2的小方阵。首先,在左上角的方阵中做记号,每行每列,各取一半打上记号。然后,将其向其余3个方阵中映像。接着,从左上角格子开始,按从左到右,从上到下的次序将1到n*n的值往方阵中填写,但遇到作了标记的格子时跳过。再从右下角格子开始,按从右到左,从下到上的次序将1到n*n的值往方阵中填写,但遇到已填过值的格子时跳过,既可以构成一个魔方阵。具体实现时:左上角和右下角的n/2*n/2的小矩阵,偶行偶列,奇行奇列赋值为0,其余赋值为1;右上角和左上角的n/2*n/2的小矩阵,偶行奇列,奇行偶列赋值为0,其余赋值为1。然后,从左上角格子开始,按从左到右,从上到下的次序将1到n*n的值往方阵中赋,但遇到值为0时跳过;再从右下角格子开始,按从右到左,从下到上的次序将1到n*n的值往方阵中赋,但遇到值为1时跳过。(3)当n为单偶数时,即n=2*(2*m+1)时,算法为:把n阶模仿阵先均分为A,B,C,D四个同样的小方阵,先按先前奇数阶魔方的形成方法在A,B,C,D中构成四个奇阶魔方,其中,A用1到n/2*n/2填写;B用n/2*n/2+1到2*n/2*n/2填写;C用2*n/2*n/2+1到3*n/2*n/2填写;D用3*n/2*n/2+1到n*n填写。先在A的中间一行从左侧的第二列起取m个格子,把这些格子中的数字同D相应格子中的数字对调;然后,在C中从最后一列起在各行中取m-1个格子,把这些格子中的数字同B相应格子中的数字对调。具体实现时:设A,B,C,D四个二维数组,对于A调用形成奇阶魔方的函数array_pointerjishu(intn,int matrix1[][100]),将A用1到n/2*n/2排成魔方阵。B,C,D魔方阵有个特点就是分别在前一个魔方阵中各个数字上加n/2*n/2所构成的新魔方阵,则设了一个实现此功能的函数array_pointer first(intn,int A2[][100],int B2[][100])。然后,采用引用的方法设了一个实现相应位置上函数交换的函数void swap(int w,int v)。最后,将四个小方阵联结起来构成所要求的魔方阵方法一;/*此程序使我按照上面介绍的魔方阵的规律编写的,不过只能求奇数魔方阵,经过测试可以算到508阶*/#define N 7#includestdio.hvoid main(){int a[N][N],i,j,k; for(i=0;iN;i++) /*先处理第一行*/for(j=0;jN;j++) { a[i][j]=0; /*先令所有元素都为0*/ } j=(N-1)/2; /*判断j的位置*/ a[0][j]=1; /*将1放在第一行中间一列*/ for(k=2;k=N*N;k++) /*再从2开始处理*/ {i=i-1; /*存放的行比前一个数的行数减1*/ j=j+1; /*存放的列比前一个数的列数加1*/ if((i0)(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/ {i=i+2; j=j-1; }else { if(i0) /*当行数减到第一行,返回到最后一行*/i=N-1; if(jN-1) /*当列数加到最后一行,返回到第一行*/ j=0; } if(a[i][j]==0) /*如果该元素为0,继续执行程序*/a[i][j]=k; else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/ {i=i+2; j=j-1;a[i][j]=k; } } for(i=0;iN;i++) /*输出数组*/ {for(j=0;jN;j++)pr
您可能关注的文档
最近下载
- CYX-QEHP-39新改扩建项目环境影响控制程序B0(工厂体系文件模板).doc VIP
- 03~04_项目融资模式之BOT项目.ppt VIP
- 团章考试题及答案.doc VIP
- 2025年中考真题作文解读:此刻,你不一样(威海)(写作指导+例文展示+名师点评).docx
- 小学一年级学习计划..doc VIP
- 包头市户外广告和牌匾设置技术标准标准DB 1502T006—2020.pdf
- 网络直播带货主播能力模型构建研究.docx VIP
- 淮阴工学院班主任工作手册.doc VIP
- 2024年新改版教科版一年级上册科学全册教案教学设计(新教材专用).docx
- 2025道德与法治二年级上册全册核心素养教案教学设计.docx
文档评论(0)