方法一;
/*此程序使我按照上面介绍的魔方阵的规律编写的,不过只能求奇数魔方阵,经过测试可以算到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
}
魔方教程公式如下:
工具:二阶魔方。
1、首先还原底层角块:这一步要将底层的4个角块都复原。
2、白色向右就用算法1,先转右面,R U R2 R U R2。
3、白色向前就用算法2,先转正面,F2 U2 F U F2 U2 F。
4、重复做4个角块,就可以做好底层了。
5、然后还原顶部颜色:这一步要还原4个角块顶面的颜色。
6、情况6是先用公式2-2,其他几种情况都是先用公式2-1的,其他情况都先用一次公式2-1。
7、接着还原顶层角块:如果有类似这样的情况,就把同色的角块旋转到正对着自己的位置。
8、再用这个算法:R B2 R F2 R2 B R F2 R2,就可以完成还原了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)