问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-10 15:11

我来回答

2个回答

热心网友 时间:2023-10-13 00:56

#define sizem ((size / 2 - 1) / 2)
#define sizeh (size / 2)
#define sizesq (sizeh * sizeh)

void main()
{
int size = 0; //幻方大小
int x = 0, y = 0; //下一个数字所放的位置
int i, j; //循环变量
int st_i, st_x = 0, st_y = 0;
int currnum; //构造双偶数阶幻方填数的变量
int temp;

//-----输入幻方大小-------------------------------
while ((size < 1) || (size > 31) || (size == 2))
{
printf("size of magic square:");
scanf("%d", &size);
}

//-----建立二维动态数组---------------------------
int **a = new int *[size];
for (i=0; i<size; i++)
{
a[i] = new int [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++;
}
//-----当超出上面的边界时-----------------
else if (y == 0)
{
x++;
y = size - 1;
}
//-----当超出右面的边界时-----------------
else if (x == size - 1)
{
x = 0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}
}
else if (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)
{
case 0:
st_x = 0;
st_y = 0;
break;
case 1:
st_x = sizeh;
st_y = sizeh;
break;
case 2:
st_x = sizeh;
st_y = 0;
break;
case 3:
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++;
}
//-----当超出上面的边界时-----------------
else if (y == 0)
{
x++;
y = size / 2 - 1;
}
//-----当超出右面的边界时-----------------
else if (x == size / 2 - 1)
{
x = 0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}//-----end of for(i)---------------------
}//-----end of for(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;
}
}
}//-----end of if(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;

}

热心网友 时间:2023-10-13 00:56

图的遍历嘛!
虽然我也是刚学一学期。
可我认为,它不如数独那啊!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 什么是幻方常数 爆炒茄子为什么茄子会变黑 What is magic square matrix? 为什么那个茄子炒出来。也会变成黑色? 什么是幻方?? 一篇有关 magic square的八十字的英语作文 煮好的蛋清怎么做好吃 谁怎么可以报名童星? 怎么当童星,11岁还能当童星吗? 对方设置加不了怎么办? 小米换机收不到荣耀60了 怎么样才能成为童星? 怎么样才能当童星?在哪报名 我的重新登录,里面通讯录里的朋友一个也没了?求解!!还能找回吗?_百度问一问 有对方的怎么加不了? 加别人的怎么加不上?- 问一问 晒笋干可以放洗衣机脱水吗? cAD绘图软件2012怎么下? 一袋大米三分之二千克要24元这种大米一千克要多少元一元可以买多少千克大米? 我们要用autoCAD制图,学校用的是2007版本,现在出2012的了,两者内容有什么不同吗?在哪下载? 四海三山八仙洞,九龙王子一枝莲,二七六郎赏月半,周围十五月团圆,是什么意思 谁有英文版的数学试卷?(初中水平) 港湾式候车亭的作用是什么?对候车亭有什么好处?哪里有生产的? 微信朋友圈设置了对部分人可见,别人也会看到这个标志吗 微信设置了部分人可见允许看见你消息的人看的见那个标志么 微信发的朋友圈设置了只一个人能可见,会显示只有他本人能看见的标志吗? 微信发朋友圈时 设置只有一个标签内的人可见 而这个标签内只有一个人 对方能看到那个单独可见的标志吗? 港湾式候车亭和直线候车亭有什么区别,哪种的更好 论文查重怎么查的 有什么办法可以查询自己的银行卡有没有绑定支付宝或财付通之类的快捷支付? 怎样在网上查询一张银行卡是否开通快捷支付功能 摄影初学者买个什么镜头好 忘记自己的卡业务,怎么查询卡开通支付宝没有 新手小白想买相机,可以拍照摄像的,预算2到3千有什么推荐吗? 如何知道自己有没有开通支付宝账号 新手应该选什么相机和镜头 退休跟工龄有关系吗? 怎么查询自己开没开通 支付宝卡通??? 推荐一款经济实惠拍摄风景用的镜头,本人新手,用的是佳能60D单反。 原版周公解梦 养大象