如何用程序求解N×N宫图呢?

knightzhuwei 2010-12-13 10:46:18
所谓N×N宫图是指在一个N×N的矩阵中填入不重复的1,2,3,....N×N,使得矩阵的每行每列的和都相等
特定宫图 比如九宫图 二十五宫图等好像是有现成方法求解的 有没有求解N×N宫图的通用算法呢?
百度了下貌似没找到答案 特在此求解~
...全文
423 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mumubangditu 2010-12-14
  • 打赏
  • 举报
回复
围观学习,偶数的分为4的倍数与非4的倍数两类。
ishisy 2010-12-14
  • 打赏
  • 举报
回复
budong
SomethingWrong 2010-12-13
  • 打赏
  • 举报
回复
奇数规则很简单,斜着填数就行。偶数的要复杂些,还要再分成几类分别讨论
knightzhuwei 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 esperantor 的回复:]
偶数有幻方?
[/Quote]

三十六宫图:横竖斜,皆为111

01 35 31 29 05 10
07 26 13 12 23 30
09 15 20 21 18 28
33 19 16 17 22 04
34 14 25 24 11 03
27 02 06 08 32 36




六十四宫图: 横竖斜,皆为260

64 02 03 61 60 06 07 57
09 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
08 58 59 05 04 62 63 01
曳尾之鱼 2010-12-13
  • 打赏
  • 举报
回复

偶数有幻方?
knightzhuwei 2010-12-13
  • 打赏
  • 举报
回复
奇数幻方是有现成解法的 可是偶数幻方没有 我只是想找一个通用的。。额
曳尾之鱼 2010-12-13
  • 打赏
  • 举报
回复

#include <stdio.h>
#define N 100

void main()
{
int i,j,x,y,k,n;
int arr[N][N] = {0};//前一行后一列
printf("/************魔方阵************/\n");
printf("请输入魔方阵的阶数(奇数):");
scanf("%d",&n);

i = 0;j = n/2;
for (k=1;k<=n*n;k++)
{
arr[i][j] = k;
x = i;
y = j;

if(i==0) i=n-1;
else i=i-1;

if(j==n-1) j=0;
else j=j+1;

if(arr[i][j]!=0)
{
i = x+1;
j = y;
}
}
printf("%d阶魔方阵如下所示:\n",n);
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf("%5d",arr[i][j]);
puts("\n");
}
}


看看这个

N为奇数
用户 昵称 2010-12-13
  • 打赏
  • 举报
回复
还是这个吧,清楚一些

// huangfang.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

void setvalue( unsigned char *hf, int howmuch, int x, int y, unsigned char value )
{
//填幻方矩阵
*( hf + ( y - 1 ) * howmuch + ( x - 1 ) ) = value;
}

unsigned char getvalue( unsigned char *hf, int howmuch, int x, int y )
{
//填幻方矩阵
return *( hf + ( y - 1 ) * howmuch + ( x - 1 ) );
}

int printhf( int howmuch )
{
if( howmuch > 9 ) //太多了不考虑
{
return 1;
}
if( !( howmuch % 2 ) ) //只考虑奇数的
{
return 1;
}

unsigned char buf[ 100 ] = ""; //100个足够了,相当于10 * 10了

int i, j;
int x, y;
for( i = 1; i <= howmuch * howmuch; i++ )
{
if( 1 == i )
{
//第一个,x当然中间的一个,Y就是第一行
x = ( howmuch / 2 ) + 1;
y = 1;
setvalue( buf, howmuch, x, y, i );
}
else
{
if( x == howmuch + 1 && 0 == y )
{
//右上角
x--;
y++;
y++;
}
if( y < 1 )
{
//向上出界了,应该转到最下面
y = howmuch;
}
if( x > howmuch )
{
//向右出界了,应该转到最左边
x = 1;
}
if( getvalue( buf, howmuch, x, y ) )
{
//如果这个位置已经添上了,使用正下一个
x--;
y++;
y++;
}
setvalue( buf, howmuch, x, y, i );
}
//填完之后,X++,Y--,向右上角上台阶嘛
x++;
y--;
}

for( i = 0; i < howmuch; i++ )
{
for( j = 0; j < howmuch; j++ )
{
printf( " %2d ", *( buf + i * howmuch + j ) );
}
printf( "\r\n" );
}
printf( "\r\n" );
printf( "\r\n" );
return 0;
}

int main(int argc, char* argv[])
{
//printf("Hello World!\n");
for( int i = 3; i < 11; i += 2 )
{
printhf( i );
}
return 0;
}


  8   1   6
3 5 7
4 9 2


17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9


30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20


47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
67 78 8 10 21 32 43 54 56
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
用户 昵称 2010-12-13
  • 打赏
  • 举报
回复
俺以前自己写了一个,俺只记住奇数的了,小学大家都学奥数。

// huangfang.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

void setvalue( unsigned char *hf, int howmuch, int x, int y, unsigned char value )
{
//填幻方矩阵
*( hf + ( y - 1 ) * howmuch + ( x - 1 ) ) = value;
}

unsigned char getvalue( unsigned char *hf, int howmuch, int x, int y )
{
//填幻方矩阵
return *( hf + ( y - 1 ) * howmuch + ( x - 1 ) );
}

int printhf( int howmuch )
{
if( howmuch > 9 ) //太多了不考虑
{
return 1;
}
if( !( howmuch % 2 ) ) //只考虑奇数的
{
return 1;
}

unsigned char buf[ 100 ] = ""; //100个足够了,相当于10 * 10了

int i, j;
int x, y;
for( i = 1; i <= howmuch * howmuch; i++ )
{
if( 1 == i )
{
//第一个,x当然中间的一个,Y就是第一行
x = ( howmuch / 2 ) + 1;
y = 1;
setvalue( buf, howmuch, x, y, i );
}
else
{
if( x == howmuch + 1 && 0 == y )
{
//右上角
x--;
y++;
y++;
}
if( y < 1 )
{
//向上出界了,应该转到最下面
y = howmuch;
}
if( x > howmuch )
{
//向右出界了,应该转到最左边
x = 1;
}
if( getvalue( buf, howmuch, x, y ) )
{
//如果这个位置已经添上了,使用正下一个
x--;
y++;
y++;
}
setvalue( buf, howmuch, x, y, i );
}
//填完之后,X++,Y--,向右上角上台阶嘛
x++;
y--;
}

for( i = 0; i < howmuch; i++ )
{
for( j = 0; j < howmuch; j++ )
{
printf( " %2d ", *( buf + i * howmuch + j ) );
}
printf( "\r\n" );
}
printf( "\r\n" );
printf( "\r\n" );
return 0;
}

int main(int argc, char* argv[])
{
//printf("Hello World!\n");
for( int i = 3; i < 11; i += 2 )
{
printhf( i );
}
return 0;
}

用户 昵称 2010-12-13
  • 打赏
  • 举报
回复
有很多吧,俺管那叫幻方,俺找找。
knightzhuwei 2010-12-13
  • 打赏
  • 举报
回复

原来如此 真有现成的啊 我土了。。
结贴
用户 昵称 2010-12-13
  • 打赏
  • 举报
回复
偶数的分为4的倍数与非4的倍数两类。
yui 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 knightzhuwei 的回复:]

奇数幻方是有现成解法的 可是偶数幻方没有 我只是想找一个通用的。。额
[/Quote]

偶数阶幻方也是有现成解的,百度“偶数阶幻方”即可
SomethingWrong 2010-12-13
  • 打赏
  • 举报
回复
都是奥训班那点玩意
内容概要:本文聚焦2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”,提供涵盖数学建模、算法实现与论文撰写的全套技术支持,并扩展分享多个科研方向的Matlab/Simulink仿真项目,如无人机协同路径规划、电力系统无功优化、信号处理、图像处理、车间调度、新能源预测与优化调度等。资源内容不仅服务于竞赛备赛,还覆盖智能优化、通信定位、边缘计算、雷达追踪、深度学习等多个前沿科研领域,旨在为参赛学生与初级科研人员提供系统化、高质量的技术参考与资源共享。文中强调科研需逻辑严密、善于借力,并倡导按目录系统学习以提升建模能力与科研素养,所有资料可通过指定网盘链接或微信公众号免费获取。; 适合人群:全国大学生数学建模竞赛参赛者,具备Matlab编程与数学建模基础的本科及研究生,以及从事智能优化、信号处理、电力系统、路径规划、机器学习等方向的初级科研人员。; 使用场景及目标:①备战数学建模竞赛,快速掌握赛题解题思路、算法模型与论文写作模板;②开展科研项目时复现经典算法、借鉴成熟仿真方法,提升研究效率;③系统学习多领域(如无人机路径规划、微电网优化、光伏/风电预测、图像处理)的Matlab/Simulink实现技术。; 阅读建议:建议读者按照资源目录顺序系统浏览,结合网盘中的代码与文档进行实践操作,重点关注建模逻辑、算法实现细节与仿真结果分析,同时关注公众号与共享链接以获取完整资料,全面提升竞赛竞争力与科研实践能力。
下载代码方式:https://pan.quark.cn/s/0636d5a2cd63 爱普生1390型宽幅照片打印机是一款备受摄影发烧友及小型设计机构欢迎的经典设备。经过一段时间的持续运作,其供纸辊可能会遭遇磨损或积聚灰尘,进而干扰打印机的正常运作,例如在打印过程中出现纸张移动或卡住等情况。本指南将系统性地阐述对爱普生1390进行拆解并更换供纸辊的具体操作方法。 1. **前期准备** 在着手拆解之前,务必要将打印机关闭并切断电源供应。需要准备一套适配的小型螺丝刀及辅助工具,同时备齐全新的供纸辊。采购供纸辊时,必须核实其与爱普生1390型号完全兼容。 2. **外部拆解** 开始移除打印机的外壳部件。通常情况下,这涉及到松开底部和背面的固定螺栓。在分离外壳时需格外谨慎,以免拉扯到机内部署的电线或线缆。 3. **曝露供纸部件** 继续对内部结构进行拆解,直至定位到供纸辊组件。这个过程可能需要取下墨盒托架、进纸模块等零件。务必记住各个部件的原始位置和朝向,以便后续顺利复原。 4. **拆卸供纸辊** 供纸辊一般通过轴心固定于打印机内部。借助螺丝刀或其他适宜工具松开固定轴,随后轻轻转动或抽离供纸辊。操作过程中需留意避免损伤周边的塑料构件。 5. **清洁或调换供纸辊** 若供纸辊仅因污损,可用柔软布料蘸取少量酒精进行轻柔擦拭,以去除附着物和尘埃。倘若供纸辊已出现损耗,则必须更换为新的。新供纸辊应依照原样安装,确保轴心与齿轮系统精确对接。 6. **重新组装** 依照与拆解相反的顺序,小心地将各个部件逐一装回,确保每部分都准确对齐并牢固固定。特别要注意连接线缆,防止其发生扭曲或过度弯曲。 7. **功能测试** 组装完毕后,重新接入电源,启动打印机,检验其是否能正常...

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧