求魔方的算法 我指的是计算机编程算法 最好有c++ 或c#的源代码
奢姿美妆达人
2024-05-18 14:03:17
最佳回答
具体做法:方法/*此程序使我按照介绍的魔的规律编写的,不过只能求奇方阵,经过测试可以算到508阶*/#define n 7#include<stdio.h>void main(){ int a[n][n],i,j,k; for(i=0;i<n;i++) /*先处理第一行*/ for(j=0;j<n;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((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=0;i<n;i++) /*输出数组*/ { for(j=0;j<n;j++) 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=1;k<=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=0;i<n;i++) /*输出数组*/ { for(j=0;j<n;j++) printf("%5d",a[i][j]); printf("\n\n"); } } 20210311