当前位置:新励学网 > 秒知问答 > 求一个n阶魔方阵的算法!希望能用标准c的风格来做!

求一个n阶魔方阵的算法!希望能用标准c的风格来做!

发表时间:2024-07-08 12:09:54 来源:网友投稿

#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;

}

免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。

如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!