}
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,jNowSum+=p[i][j];
}if(NowSum!
=sum)
{
YesOrNo=false;
gotoEND;
}
END:
returnYesOrNo;
}voidcombination(int**p,intn,int*a)//求m=n*n个数(1,2,3m)的全排列
{
intm=n*n;
staticintNum=0;
int*b_val=newint[m];
intc=0,k,i,j;b_val[c]=-1;//一维数组首地址的值赋-1c[0]-1while(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;k下标等于C下标
if(b_val[k]==b_val[c])break;
if(k==c)//如果没有重复元素,就可以确定当前元素值,并继续排列下
一个下标的数组元素
{if(c+1方式,否则继续排列下一个元素
//8{
++c;//123...78b_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];
for(i=1;i<=n*n;i++)
{
AllNum[i-1]=i;
}
combination(p,n,AllNum);
delete[]AllNum;
}
voidmain()
inti,n,**a;
strings;
do
//输入n阶方阵的阶数n
cout<<"请输入n阶方阵的阶数n(退出程序按e或E键):
cin>>s;
if(!
strcmp(s.c_str(),"e")||!
strcmp(s.c_str(),"E"))
{
break;
}
elseif(s.find_first_not_of("0123456789")!
=string:
:
npos)
{
"<cout<<"请输入有效的数字,不能含有非数字的字符。
continue;
}
else
{
n=atoi(s.c_str());
if(n<1)
{
cout<<"请输入有效的数字,必须>=1。
"<continue;
}
//分配内存
a=newint*[n];
for(i=0;i{
a[i]=newint[n];
}
cout<<"正在运算,请等待。
。
。
。
。
。
"<//给n阶方阵的元素赋值
evaluate(a,n);cout<<"运算结束!
"<for(i=0;i{
delete[]a[i];
}
delete[]a;
}
}while
(1);
return;
}
/*5、求一个3x3矩阵对角线元素之和。
*/
#include
intdia(inta[][3]);
voidmain()
inti,j,sum,a[3][3]={2,3,5,6,2,3,1,9,0};
cout<<"a=";
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)cout<cout<}
sum=dia(a);cout<<"\nsum="<}
intdia(inta[3][3])
{
inti,j,sum=0;
for(i=0;i<3;i++)//主对角线之和
for(j=i;j<=i;j++)
sum+=a[i][j];
for(j=0;j<3;j++)//另一个对角线之和for(i=2-j;i<=2-j;i