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

knightzhuwei 2010-12-13 10:46:18
所谓N×N宫图是指在一个N×N的矩阵中填入不重复的1,2,3,....N×N,使得矩阵的每行每列的和都相等
特定宫图 比如九宫图 二十五宫图等好像是有现成方法求解的 有没有求解N×N宫图的通用算法呢?
百度了下貌似没找到答案 特在此求解~
...全文
403 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
  • 打赏
  • 举报
回复
都是奥训班那点玩意
内容概要:本文档为成都科洛威尔科技有限公司生产的MIL-1394B仿真板卡的API函数使用手册,详细介绍了该板卡在Windows和Linux环境下进行MIL-1394B/AS5643总线协议仿真和测试所需的API函数、数据结构、使用流程及例程。板卡支持CC(控制计算机)、RN(远程节点)和BM(总线监控)三种工作模式,提供丰富的函数用于设备管理、节点控制、消息收发、故障注入、中断处理等功能,并涵盖数据包格式、发送接收流程、错误检测机制等关键技术细节。手册还提供了函数调用示例和典型应用场景,帮助开发者快速掌握板卡的开发与调试。; 适合人群:从事航空电子、嵌入式系统或工业自动化领域,具备C/C++编程基础并熟悉总线通信协议的1-3年工作经验的软硬件研发工程师。; 使用场景及目标:①在复杂总线环境中实现高精度数据仿真与测试;②开发基于MIL-1394B协议的通信系统;③进行消息收发控制、时序偏移管理、错误注入测试及中断响应处理等高级功能验证;④通过API调用实现对板卡工作模式、数据流、状态监测的全面控制。; 阅读建议:建议结合配套的demo示例程序进行实践,重点理解各函数的调用时序与参数配置逻辑,尤其关注STOF时序控制、消息发送模式、错误注入机制等核心功能的实现原理。使用前需仔细阅读“基本使用流程”与“附录”部分,确保正确配置硬件环境与通信参数。

33,025

社区成员

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

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