求魔方的算法 我指的是计算机编程算法 最好有C++ 或C#的源代码

求魔方的算法 我指的是计算机编程算法 最好有C++ 或C#的源代码,第1张

具体做法:

方法一;

/*此程序使我按照上面介绍的魔方阵的规律编写的闷脊,不过只能求奇数魔方阵,经过测试可以算到508阶*/

#define N 7

#include<stdio.h>

void main()

{

int a[N][N],i,j,k

for(i=0i<Ni++)/*先处理第一行*/

for(j=0j<Nj++)

{

a[i][j]=0/*先令所有元素都为0*/

}

j=(N-1)/2/*判断j的位置*/

a[0][j]=1 /*将1放在第一行中间一列*/

for(k=2k<=N*Nk++)/*再从2开始处理*/

{

i=i-1 /*存放的行比前一个数的行数减1*/

j=j+1 /*存放的列比前一个数的列数加1*/

if((i<0)&&(j==N))/*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/

{

i=i+2

j=j-1

}

else

{

if(i<0)/*当行数减到第一行,返回到最后一行*/

i=N-1

if(j>N-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=0i<Ni++)/*输出数组*/

{

for(j=0j<Nj++)

printf("%5d",a[i][j])

printf("\n\n")

}

}

方法二:

/*这个是网友qfyzy为帮助我找错而提供的,可以算到99阶*/

#define N 7

#include<stdio.h>

void main()

{

int a[N][N]={0},i=0,j,k/*先令所有元素都为0*/

j=(N-1)/2

i=0

for(k=1k<=N*N)/*开始处理*/

{

if((i<0)&&(j==N))/*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/

{

i=i+2

j=j-1

}

else if(i<0)/*当行数唯誉减到第一行,返回到最后一行*/

i=N-1

else if(j>N-1)/*当列数加到最后一行,返回到第一行*/

j=0

else if(!a[i][j]){ /*如果该元素为0,继续执行程序*/

a[i][j]=k++

i=i-1

j=j+1

}

else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/

{

i=i+2

j=j-1

}

}

for(i=0i<Ni++)/*输出数组*/

{

for(j=0j<Nj++)

printf("%5d",a[i][j])

printf("\n\n")

}

}

下面是一个打印奇数阶魔方阵的程序掘氏橡:

#include<stdio.h>

int main()

{int n=0,i,j,k=1,p,q,a[20][20]={0}

while(!(n%2))

{printf("请输入一个小核态于20的奇判旁数:")

scanf("%d",&n)

}

i=0

j=n/2

for(p=0p<np++)

{for(q=0q<nq++)

{if(q>0)

{i=(i+n-1)%n

j=(j+1)%n

}

a[i][j]=k++

}

i=(i+1)%n

}

for(i=0i<ni++)

{for(j=0j<nj++)

printf("%4d",a[i][j])

printf("\n")

}

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12366092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存