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

knightzhuwei 2010-12-13 10:46:18
所谓N×N宫图是指在一个N×N的矩阵中填入不重复的1,2,3,....N×N,使得矩阵的每行每列的和都相等
特定宫图 比如九宫图 二十五宫图等好像是有现成方法求解的 有没有求解N×N宫图的通用算法呢?
百度了下貌似没找到答案 特在此求解~
...全文
391 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
  • 打赏
  • 举报
回复
都是奥训班那点玩意
内容概要:本文系统研究了基于动态三维环境下的Q-Learning算法在无人机自主避障路径规划中的应用,依托Matlab代码实现,深入剖析了强化学习在复杂、时变空间中实现智能决策的机制。研究构建了三维网格化状态空间模型,设计了合理的动作集合与奖励函数,充分考虑静态与动态障碍物的存在,使无人机能够通过与环境持续交互,自主学习规避障碍并趋近目标的最优策略。文章不仅展示了Q-Learning算法在路径规划中的具体实现流程,还涵盖了状态表示、策略迭代、收敛性分析等关键环节,并通过仿真实验验证了算法的有效性与鲁棒性,为智能体在动态环境中的自主导航提供了理论依据和技术参考。; 适合人群:具备人工智能、自动化、计算机科学或机器人学等相关专业背景,熟悉Matlab编程语言和基本的强化学习概念,从事无人机控制、智能导航、路径规划算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、灾害现场等复杂动态三维场景中无人机的自主飞行与紧急避障;②作为强化学习解决实际路径规划问题的教学实例,帮助理解Q-Learning的核心思想、状态-动作值函数更新过程及探索-利用权衡策略;③为后续研究更先进的深度强化学习算法(如DQN、PPO)在无人机控制中的应用奠定基础和提供对比基准。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,通过调整学习率、折扣因子、探索率(ε-greedy)等超参数,观察其对算法收敛速度和最终路径规划质量的影响,并尝试修改环境复杂度(如增加障碍物密度或动态性)以评估算法的泛化能力。
内容概要:本文系统研究了三相逆变器逆变电路的闭环控制模型,基于Simulink平台构建完整的仿真系统,深入探讨闭环控制策略对逆变器输出电压、电流波形质量的调控作用。研究内容涵盖三相逆变器的基本工作原理、空间矢量脉宽调制(SVPWM)技术、电压外环与电流内环构成的双闭环控制架构设计、PI控制器参数整定方法,并通过仿真实验全面评估系统在阻性、感性及非线性负载条件下的动态响应特性、稳态精度以及抗负载扰动能力,从而验证闭环控制策略的有效性与鲁棒性。同时,文档关联了多项电力电子与新能源并网相关的仿真案例,凸显其在光伏发电、微电网并网、储能系统等实际工程应用中的重要价值; 适合人群:具备电力电子技术、自动控制理论基础知识,熟悉Simulink/MATLAB仿真环境,从事电气工程、新能源发电、智能电网等方向的科研人员、工程技术人员及研究生; 使用场景及目标:①掌握三相逆变器双闭环控制系统建模与仿真的完整流程;②深入理解电压电流双闭环控制的设计原理及其在提升电能质量方面的实现机制;③为光伏并网逆变器、储能变流器(PCS)、微网能量管理系统等实际项目的控制算法开发与性能验证提供理论依据和技术参考; 阅读建议:建议结合文中提及的Simulink仿真模型进行实操演练,重点关注控制器参数调节对系统稳定性与动态性能的影响规律,并进一步拓展学习如重复控制、PR控制、模型预测控制(MPC)等先进控制策略在逆变器中的应用与对比分析。
内容概要:本文围绕单相逆变器闭环逆变电路的PWM模型展开仿真研究,基于Simulink平台构建系统模型,重点探究闭环控制策略下脉宽调制(PWM)技术在单相逆变器中的应用。研究内容涵盖系统建模、控制器设计、反馈回路构建及PWM信号生成等关键环节,通过仿真分析逆变电路在闭环控制下的动态响应特性、输出波形质量与系统稳定性,旨在提升逆变器的输出精度、抗干扰能力与整体性能,为电力电子系统的设计与优化提供理论支撑与仿真验证依据。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事电气工程、新能源发电、电源系统开发等相关领域的科研人员及高校研究生。; 使用场景及目标:①应用于单相逆变电源、光伏并网系统、不间断电源(UPS)等电力变换设备的控制器设计与性能优化;②通过仿真掌握闭环控制与PWM调制技术的实现机制,深入理解PI控制器参数整定、反馈采样方式选择及系统稳定性调节方法,进而提升实际工程系统的动态响应与稳态控制精度。; 阅读建议:建议读者结合Simulink动手搭建模型,逐步调试控制器参数,重点关注闭环反馈结构、PI调节器设计与PWM调制模块的实现逻辑,同时可通过对比开环与闭环系统的输出波形,深入理解闭环控制对系统性能的提升作用,从而深化对逆变器控制原理的掌握。

33,025

社区成员

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

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