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

knightzhuwei 2010-12-13 10:46:18
所谓N×N宫图是指在一个N×N的矩阵中填入不重复的1,2,3,....N×N,使得矩阵的每行每列的和都相等
特定宫图 比如九宫图 二十五宫图等好像是有现成方法求解的 有没有求解N×N宫图的通用算法呢?
百度了下貌似没找到答案 特在此求解~
...全文
412 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
  • 打赏
  • 举报
回复
都是奥训班那点玩意
代码转载自:https://pan.quark.cn/s/6708bc18cb4a 《Proteus 8.15 SP0:电子电路设计的强大平台》 Proteus 8.15 SP0是一款在电子工程领域享有高度声誉的电子电路设计软件,它在电子工程领域中占据着核心地位。这款专业级别的工具凭借其卓越的功能和用户友好的界面,为工程师们提供了从概念构思到最终实现的完整解决方案。 1. **软件介绍** Proteus 8.15 SP0是由Labcenter Electronics公司研发的一款集成仿真与PCB设计软件。其内部版本编号33980体现了该软件的最新迭代和优化。软件的核心优势在于其一体化的设计平台,能够支持电路设计、模拟仿真、PCB布局以及3D视图预览,显著提升了设计效率。 2. **电路设计与模拟** - **元件资源**:Proteus内置了种类繁多的元件库,涵盖了各类晶体管、电阻、电容、集成电路等,覆盖了数字电路、模拟电路、微控制器等多个技术领域,能够满足不同项目的需求。 - **即时模拟**:用户能够在设计阶段实时监控电路的工作状态,这在调试和验证电路设计时极具价值,减少了制作物理原型的必要性,从而降低了成本。 - **混合仿真模式**:Proteus支持模拟与数字信号的联合仿真,使得复杂的混合系统设计成为可能。 3. **PCB设计** - **布局与布线**:Proteus配备了直观的PCB布局工具,使用户能够轻松调整元件位置,选择自动或手动布线,确保电路的可靠性和可制造性。 - **规则验证**:内置的规则验证功能能够帮助工程师避免违反设计规范,例如间距、过孔尺寸等,保障了PCB设计的质量。 - **三维视图**:独特的三维视图功能使用户能够从多...
内容概要:本文深入研究了基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测方法,并提供了完整的Python代码实现。该模型通过卷积神经网络(CNN)提取输入数据中的局部特征与时序模式,利用双向长短期记忆网络(BiLSTM)充分捕捉时间序列前后向的长期依赖关系,并引入注意力机制(Attention)动态加权关键时间步的输出,从而显著提升预测精度。文中系统阐述了数据预处理、模型架构设计、训练优化流程及评估指标分析,实验结果表明,该混合模型在负荷预测任务中相较传统单一模型具有更强的非线性拟合能力与更高的预测准确性。; 适合人群:具备Python编程基础和深度学习理论知识的高校研究生、科研人员,以及从事电力系统规划、智能电网、能源管理等领域工作的工程技术人员。; 使用场景及目标:①应用于电力系统短期负荷预测,为电网调度、发电计划和需求响应提供可靠数据支持;②作为深度学习在时间序列预测中的典型案例,帮助学习者掌握CNN、LSTM与Attention机制的融合建模方法;③为智能能源管理系统和负荷预测平台的研发提供技术参考与实现方案。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,深入理解各模块的设计原理与实现细节,重点关注注意力机制对模型性能的提升作用,并可通过调整网络结构参数、优化损失函数或引入外部特征变量等方式进一步探究模型的改进与泛化能力。

33,025

社区成员

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

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