魔方阵实现方法全Word文档下载推荐.docx
《魔方阵实现方法全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《魔方阵实现方法全Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
![魔方阵实现方法全Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/25/cf63f5e3-3b8d-4ada-9b02-9f48f6c60a5f/cf63f5e3-3b8d-4ada-9b02-9f48f6c60a5f1.gif)
{
inta[N][N],i,j,k;
for(i=0;
i<
N;
i++)/*先处理第一行*/
for(j=0;
j<
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++)/*输出数组*/
printf("
%5d"
a[i][j]);
\n\n"
);
}
方法二:
/*这个是网友qfyzy提供的,可以算到99阶*/
inta[N][N]={0},i=0,j,k;
i=0;
for(k=1;
)/*开始处理*/
elseif(i<
elseif(j>
elseif(!
a[i][j]){/*如果该元素为0,继续执行程序*/
a[i][j]=k++;
方法三:
/*此程序是在网上找到的c程序设计习题7.7的答案,只能算奇数阵,可以算到15阶*/
{inta[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{printf("
请输入阶数:
"
/*原答案没有这个输出语句*/
scanf("
%d"
&
n);
if((n!
=0)&
(n<
=15)&
(n%2!
=0))p=0;
for(i=1;
=n;
i++)
for(j=1;
j=n/2+1;
a[1][j]=1;
for(k=2;
=n*n;
k++)
{i=i-1;
1)&
(j>
n))
{i=i+2;
{if(i<
1)i=n;
n)j=1;
if(a[i][j]==0)a[i][j]=k;
{for(j=1;
%3d"
\n"
}
/*下面的都是在网上搜索到的,大多数是在编程论坛找到的*/
方法四:
/*这个是我找到的功能最强大的求魔方阵的程序,奇、偶阵都可以求,可以多次测试,最大阶可以自己设定(我测试的最大设定值是507,此时可以运行到506阶,不过也可以设定到508,但是这时真正运行的时候却达不到506阶)*/
#include<
stdlib.h>
math.h>
conio.h>
#defineMAX_INDEX100/*这里可以修改最大阶*/
voidswap(int*a,int*b)
intt;
t=*a;
*a=*b;
*b=t;
}
/*快速排序算法*/
voidQuickSort(inta[],intl,intr)
inti=l;
/*从左至右的游标*/
intj=r+1;
/*从右到左的游标*/
intpivot=a[l];
if(l>
=r)return;
/*把左侧>
=pivot的元素与右侧<
=pivot的元素进行交换*/
while
(1)
do
{/*在左侧寻找>
=pivot的元素*/
i=i+1;
}while(a[i]<
pivot);
{/*在右侧寻找<
j=j-1;
}while(a[j]>
if(i>
=j)break;
/*未发现交换对象*/
swap(&
a[i],&
a[j]);
/*设置pivot*/
a[l]=a[j];
a[j]=pivot;
QuickSort(a,l,j-1);
/*对左段排序*/
QuickSort(a,j+1,r);
/*对右段排序*/
voidHuanf(intArray[][MAX_INDEX],intn)
inti,j;
inta,b,m;
inttempArray1[MAX_INDEX];
inttempArray2[MAX_INDEX];
a=n/2;
b=a+1;
m=n%4;
switch(m)
case0:
case2:
/*穿心对调*/
for(i=0;
n;
for(j=0;
n/2;
if(i<
n/2)
if(i%2==1&
Array[i][j]%2==0)/*偶行换偶*/
Array[i][j],&
Array[n-1-i][n-1-j]);
elseif(i%2==0&
Array[i][j]%2==1)/*奇行换奇*/
else
Array[i][j]%2==1)/*偶行换奇*/
Array[i][j]%2==0)/*奇行换偶*/
/*End穿心对调*/
if(m==2)
if((i!
(i!
=a-1)&
=b-1)&
=n-1))
Array[i][a-1],&
Array[n-1-i][a-1]);
Array[b-1][i],&
Array[b-1][n-1-i]);
Array[0][a-1],&
Array[0][b-1]);
Array[a-1][0],&
Array[b-1][0]);
Array[2][0],&
Array[2][n-1]);
Array[0][2],&
Array[n-1][2]);
break;
case1:
case3:
Array[i][j]%2==0)/*偶行换偶*/
Array[i][j]%2==0)/*奇行换奇*/
elseif(i>
/*重排米字*/
tempArray1[i]=Array[i][i];
tempArray2[i]=Array[a][i];
QuickSort(tempArray1,0,n-1);
QuickSort(tempArray2,0,n-1);
Array[i][i]=tempArray2[i];
Array[a][i]=tempArray1[i];
tempArray1[i]=Array[i][n-1-i];
tempArray2[i]=Array[i][a];
Array[i][n-1-i]=tempArray2[i];
Array[i][a]=tempArray1[i];
/*End重排米字*/
if(m==3)
=a+1))
Array[a-1][i],&
Array[a-1][n-1-i]);
Array[a-1][a-1],&
Array[a+1][a+1]);
Array[a-1][b-1],&
Array[a+1][b-1]);
default:
return;
intNe[MAX_INDEX][MAX_INDEX];
inti,j,n;
while
(1)
printf("
PleaseInputN(0quit):
\n"
scanf("
if(n==0)
/*数组赋初值*/
Ne[i][j]=i*n+(j+1);
Huanf(Ne,n);
%-4d"
Ne[i][j]);
if(j==n-1)
getch();
方法五:
/*相比方法四的程序,这个程序更加简洁,唯一的缺陷是只能求奇数魔方阵,也可以多次测试,最大阶可以自己设定(我测试的最大设定值是507,此时也可以运行到507阶)*/
#defineMAXSIZE21/*这里可以修改最大阶*/
voidmain(void)
intmatrix[MAXSIZE][MAXSIZE];
/*themagicsquare*/
intcount;
/*1..n*ncounting*/
introw;
/*rowindex*/
intcolumn;
/*columnindex*/
intorder;
/*inputorder*/
charline[100];
do{
system("
cls"
\n\t\t\t奇数阶魔方阵(输入1退出程序)"
\n\t\t\t======================================"
\n\n请输入一个小于等于%d的奇数:
MAXSIZE);
gets(line);
order=atoi(line);
if(order==1)
exit(0);
if(order>
MAXSIZE)
\n\t\t***Error***输入的奇数<
%d\n"
MAXSIZE);
elseif(order%2==0)
\n\t\t***Error***输入的必须是奇数!
!
else
row=0;
/*startoffromthemiddle*/
column=order/2;
/*ofthefirstrow.*/
for(count=1;
count<
=order*order;
count++)
matrix[row][column]=count;
/*putnext#*/
if(count%order==0)/*movedown?
*/
row++;
/*YES,movedownonerow*/
{/*computenextindices*/
row=(row==0)?
order-1:
row-1;
column=(column==order-1)?
0:
column+1;
\n\n%d阶魔方阵如下:
order);
for(row=0;
row<
order;
row++)
for(column=0;
column<
column++)
%4d"
matrix[row][column]);
pause"
}while(order!
=1);
方法六:
/*这个程序的功能也很强大,奇、偶阵都可以求,最大阶可以自己设定(我测试的最大设定值是508,此时可以运行到508阶)*/
#defineMAX_NUM15/*这里可以修改最大阶*/
intmain()
introws=0,center=0,iArray[MAX_NUM][MAX_NUM];
intRowSet=0,LineSet=0,newRowSet=0,newLineSet=0;
inti=0,j=0;
intokNum=0;
//settheitemsofarray"
iArray"
tobe0
for(i=0;
i<
MAX_NUM;
i++)
for(j=0;
j<
j++)
iArray[i][j]=0;
//gettherowsnumber
while
(1)
输入行数:
&
rows);
if(rows<
=MAX_NUM)
rows-=1;
break;
else{
行数必须在0和%d之间,请重新"
MAX_NUM);
//setnumber'
1'
center=rows/2;
iArray[0][center]=1;
//initializetheokNum,RowSetandLineSet
okNum=1;
RowSet=0;
LineSet=center;
//seteachitemin"
while(okNum<
(rows+1)*(rows+1))
if(RowSet==0&
LineSet==rows)
RowSet+=1;
newRowSet=(RowSet==0)?
rows:
RowSet-1;
newLineSet=(LineSet==rows)?
LineSet+1;
if(iArray[newRowSet][newLineSet]!
=0)
//thereisalreadyanumberhere!
RowSet=(RowSet==rows)?
RowSet+1;
//RowSet+=1;
else{
RowSet=newRowSet;
LineSet=newLineSet;
iArray[RowSet][LineSet]=++okNum;
//printthe"
=rows;
iArray[i][j]);
system("
return0;
方法七:
/*此程序可以运行到508阶魔方阵*/
#defineN(int)5/*这里可以修改最大阶*/
inti,k,c;
intm[N][N]={0};
i=0;
k=N/2;
for(c=1;
c<
c++)
if(m[i][k]!
=0)
i++;
if(i>
N-1)i=0;
k--;
if(k<
0)k=N-1;
m[i][k]=c;
i--;
k++;
0)i=N-1;
if(k>
N-1)k=0;
%d阶魔方阵:
N);
for(k=0;
m[i][k]);
方法八:
/*此程序可以运行3阶到15阶奇数阵*/
#defineN15
intmain(void)
int