求一个n阶魔方阵的算法!希望能用标准c的风格来做!
#definesizem((size/2-1)/2)
#definesizeh(size/2)
#definesizesq(sizeh*sizeh)
voidmain()
{
intsize=0;//幻方大小
intx=0,y=0;//下一个数字所放的位置
inti,j;//循环变量
intst_i,st_x=0,st_y=0;
intcurrnum;//构造双偶数阶幻方填数的变量
inttemp;
//-----输入幻方大小-------------------------------
while((size31)||(size==2))
{
printf(sizeofmagicsquare:);
scanf(%d,&size);
}
//-----建立二维动态数组---------------------------
int**a=newint*[size];
for(i=0;i<size;i++)
{
a[i]=newint[size];
}
if(size%2==1)
{
//-----构造奇数阶(2n+1)幻方(连续摆数法)---
x=(size+1)/2-1;//第一个数字在第一行
y=0;//的正中间位置
//-----开始填数-------------------------------
for(i=1;i<=size*size;i++)
{
a[y][x]=i;
//-----分析下一个数字的位置---------------
//-----当下一个数是size的倍数时,放在正下方
if(i%size==0)
{
y++;
}
//-----当超出上面的边界时-----------------
elseif(y==0)
{
x++;
y=size-1;
}
//-----当超出右面的边界时-----------------
elseif(x==size-1)
{
x=0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}
}
elseif(size%4==0)
{
//-----构造双偶数阶(4n)型幻方(对称法)-----
//-----第一步:分区并给分区做标记-------------
for(x=0;x<size/2;x++)
{
for(y=0;y<size/2;y++)
{
if((x+y)%2==0)
{
a[x][y]=-1;
a[x][size-y-1]=-1;
a[size-x-1][y]=-1;
a[size-x-1][size-y-1]=-1;
}
}
}
//-----第二步:填数-------------------------
for(x=0;x<size;x++)
{
for(y=0;y<size;y++)
{
currnum=x*size+y;
if(a[x][y]==-1)
{
a[x][y]=size*size-currnum;
}
else
{
a[x][y]=currnum+1;
}
}
}
}
else
{
//-----构造单偶数阶(2(2m+1))幻方(斯特雷奇法)
//-----第一步:构造size/2阶幻方(连续摆数法)-
for(st_i=0;st_i<4;st_i++)
{
switch(st_i)
{
case0:
st_x=0;
st_y=0;
break;
case1:
st_x=sizeh;
st_y=sizeh;
break;
case2:
st_x=sizeh;
st_y=0;
break;
case3:
st_x=0;
st_y=sizeh;
break;
default:
break;
}
x=(sizeh+1)/2-1;//第一个数字在第一行
y=0;//的正中间位置
//-----开始填数---------------------------
for(i=1;i<=sizesq;i++)
{
a[y+st_y][x+st_x]=i+sizesq*st_i;
//-----分析下一个数字的位置---------------
//-----当下一个数是size的倍数时,放在正下方
if(i%(size/2)==0)
{
y++;
}
//-----当超出上面的边界时-----------------
elseif(y==0)
{
x++;
y=size/2-1;
}
//-----当超出右面的边界时-----------------
elseif(x==size/2-1)
{
x=0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}//-----endoffor(i)---------------------
}//-----endoffor(st_i)
//-----第二步:交换A和D的第二行起m个数字------
for(j=1;j<sizem+1;j++)
{
temp=a[(sizeh+1)/2-1][j];
a[(sizeh+1)/2-1][j]=a[(sizeh+1)/2+sizeh-1][j];
a[(sizeh+1)/2+sizeh-1][j]=temp;
}
//-----第三步:交换A和D其它行的数字-----------
for(i=0;i<sizeh;i++)
{
if(i==(sizeh+1)/2-1)
{
continue;
}
for(j=0;j<sizem;j++)
{
temp=a[i][j];
a[i][j]=a[sizeh+i][j];
a[sizeh+i][j]=temp;
}
}
//-----第四步:交换C和B最后m-1行的数字
for(i=0;i<sizeh;i++)
{
for(j=size-1;j>size-sizem;j--)
{
temp=a[i][j];
a[i][j]=a[sizeh+i][j];
a[sizeh+i][j]=temp;
}
}
}//-----endofif(size%2==0)
//-----输出幻方-----------------------------------
cout<<endl;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
cout<<a[i][j]<<;
}
cout<<endl<<endl;
}
cout<<endl;
//-----清除数组-------------------------------
for(i=0;i<size;i++)
{
delete[]a[i];
}
delete[]a;
}
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇