}
}
voidsquare(inta[][10],intk,intn)
{
inti,j;
for(i=1,j=0;i<=n*n;i++,j--,k++)//n为阶数,从1开始给数组赋值
{
if(j<0&&k>=n)//当数组行列都越出范围时候,确定数组正确位置
{
j+=2;k-=1;
}
elseif(j<0)//当数组行越出范围时候,确定数组正确位置
j+=n;
elseif(k>=n)//当数组列越出范围时候,确定数组正确位置
k-=n;
elseif(a[j][k]!
=0)//当数组原位置有数时候,确定数组位置
{
j+=2;k-=1;
}
a[j][k]=i;
}
}
//方法二:
输出N介魔方阵所有魔方阵。
#include
#include
#include
usingnamespacestd;
voidprintA(int**p,intn)//输出这个n阶魔方阵
{
cout<"<inti,j;
for(i=0;i{
for(j=0;j{
cout<}
cout<}
cout<}
boolJudge(int**p,intn)//判断是否为n阶魔方阵
{
inti,j,sum=0,NowSum=0;
boolYesOrNo=true;
for(j=0;j{
sum+=p[0][j];
}
for(i=1;i{
NowSum=0;
for(j=0;j{
NowSum+=p[i][j];
}
if(NowSum!
=sum)
{
YesOrNo=false;
gotoEND;
}
}
for(i=0;i{
NowSum=0;
for(j=0;j{
NowSum+=p[j][i];
}
if(NowSum!
=sum)
{
YesOrNo=false;
gotoEND;
}
}
NowSum=0;
for(i=0,j=0;i{
NowSum+=p[i][j];
}
if(NowSum!
=sum)
{
YesOrNo=false;
gotoEND;
}
NowSum=0;
for(i=n-1,j=0;i>=0,j{
NowSum+=p[i][j];
}
if(NowSum!
=sum)
{
YesOrNo=false;
gotoEND;
}
END:
returnYesOrNo;
}
voidcombination(int**p,intn,int*a)//求m=n*n个数(1,2,3.....m)的全排列
{
intm=n*n;
staticintNum=0;
int*b_val=newint[m];
intc=0,k,i,j;
b_val[c]=-1;//一维数组首地址的值赋-1c[0]-1
while(b_val[0]{
if(++b_val[c]//b[0]0[1]0[1]1[2]0[2]1[2]2...[6]6...[7]0...[7]7[8]0...[8]8判断魔方[8]9012345678
//[7]8[8]0...[8]7判断魔方[8]8[8]9012345687
//[6]7...[7]0...[7]6[8]8012345768
//012345786
//012345867...
//876543210
{
for(k=0;kif(b_val[k]==b_val[c])
break;
if(k==c)//如果没有重复元素,就可以确定当前元素值,并继续排列下一个下标的数组元素
{
if(c+1//8
{
++c;//123...78
b_val[c]=-1;
//continue;
}
else//生成了一组排列方式
{
k=-1;
for(i=0;i{
for(j=0;j{
p[i][j]=a[b_val[++k]];//a[0]-a[8]
}
}
//判断是否为n阶魔方阵
if(Judge(p,n))
{
printA(p,n);
}
}
}
}
else
{
c--;
}
}
delete[]b_val;
}
voidevaluate(int**p,intn)//给n阶方阵的元素赋值
{
inti;
int*AllNum=newint[3*3];