关于填N*N格子的算法讨论......

98440622 2004-10-12 01:02:09
将1到N*N个自然数数填入N*N的方格中,使得行列对角的和都为一固定(可以根据N值计算出来),我做了一种算法,不过做4*4的格子有相当多的填法,不知道对不对,稍后贴上源码,大家对这个问题怎么考虑到?请高手指点~~~~~~~~~~~~~~~~~~~~~~~

3*3共8种填法,4*4呢?
...全文
354 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
98440622 2004-10-20
  • 打赏
  • 举报
回复
我的算法比较简单,输入的N确定出关键值然后从左往右从上到下的顺序遍历N*N的每个格子,试探填入数字,填满一行判断是否符合条件,填满一列判断是否符合条件,都填满了判断对角是否符合条件,以此类推,其中需要退回的条件是当前格子没有可以填入的数字了,回溯到上一个格子选择数字,如果(0,0)位置的格子没有可选的数字了就认为全部解都已经找出,程序结束。
lanmeishui 2004-10-18
  • 打赏
  • 举报
回复
?????哎。睡觉了。明天来看!!·
rossi789 2004-10-18
  • 打赏
  • 举报
回复
rossi789@peoplemail.com.cn
lanmeishui 2004-10-18
  • 打赏
  • 举报
回复
昏,给你的E-MAIL我,
偶数的,可以做点小的
rossi789 2004-10-18
  • 打赏
  • 举报
回复
晕,用的是穷举.数字小点还行,数字一大就......
rossi789 2004-10-18
  • 打赏
  • 举报
回复
楼主能说说你程序的具体的算法么,代码看不懂.或者能否改动一下,改成输入一个偶数,然后输出幻方的程序.
newwww 2004-10-18
  • 打赏
  • 举报
回复
魔方问题吧
奇数的很好搞定了,偶数的至今没有好的解决办法

这里是奇数魔方的实现程序:
/***********************************************
* File: MagicSquare
* Author: SkyintheSea
* Email: proscv@avl.com.cn
************************************************/


#include <stdio.h>
#include <string.h>


//macros
#define M 3
#define N (2 * (M) + 1)


//global variables
int magicsquare[N][N];
int flag[N][N];;
int i;
int j;
int count;


//main entry
int main(void)
{
memset(flag, 0, sizeof(flag));

i = 0;
j = M;

count = 1;
magicsquare[0][M] = 1;
flag[0][M] = 1;

while (count != N * N)
{
count++;

if (i == 0)
{
i = 2 * M;
}

else {
i--;
}

if (j == 2 * M)
{
j = 0;
}

else {
j++;
}

if (flag[i][j] == 1)
{
if (i == 2 * M)
{
i = 1;
}

else {
i += 2;
}

if (j == 0)
{
j = 2 * M;
}

else {
j--;
}
}

magicsquare[i][j] = count;
flag[i][j] = 1;
}

for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%4d", magicsquare[i][j]);
}

printf("\n");
}

return 0;
}
98440622 2004-10-18
  • 打赏
  • 举报
回复
看来可以结帖了
98440622 2004-10-16
  • 打赏
  • 举报
回复
如果是用穷举的方法搜索呢?
malligator 2004-10-16
  • 打赏
  • 举报
回复
你的方法就是穷举吧。
穷举法对于4阶以下的还行,多了一般的机器就受不了了:
3阶的幻方组合有10的4次方种;(10K)
4阶的幻方组合有10的12次方种;(1000G)
5阶的幻方组合有10的23次方种;(1000000千万G)
...........................
而生成幻方的时间复杂度应该在O(n*n)以上。
(顺便问一下,你是怎么生成幻方的,在那个地方?我看花眼了。:)
想想你的计算机速度,应该在3G/s以下吧
98440622 2004-10-16
  • 打赏
  • 举报
回复
是啊,我用的就是穷举的方法:

自左向右遍历每个格子,试探填入数字,先保证行符合条件,然后列符合条件,最后检查对角线。回溯的条件当前格中无可用的数字,找出全部解的条件第一个格子无可用的数字。

算5×5第一个都没出来,别说所有的解了:-)
rightyeah 2004-10-15
  • 打赏
  • 举报
回复
奇数阶幻方的构造是很容易的,有一套很简单的规则。偶数阶的就麻烦点,好像是要用4个奇数阶的合起来的(4阶的直接构造),以前我在一本入门级的basic书上看到过
98440622 2004-10-15
  • 打赏
  • 举报
回复
不明白楼上的意见?怎么叫满足奇数?
kavinsnow 2004-10-14
  • 打赏
  • 举报
回复
奇数的有算法,偶数好像就没有了,楼主所写的代码并不能满足奇数.
98440622 2004-10-14
  • 打赏
  • 举报
回复
再顶一下!
98440622 2004-10-13
  • 打赏
  • 举报
回复
我现在很想知道4×4到底能有多少种填法,我用上面的程序做了一下,一共有7040种填法,会有这么多吗?
Squall1009 2004-10-13
  • 打赏
  • 举报
回复
奇数的比较好做.偶数的估计没什么好的算法吧
你可以搜索一下魔方问题
kittypizza 2004-10-12
  • 打赏
  • 举报
回复
能把主要的计算方法的想法说说吗?
kittypizza 2004-10-12
  • 打赏
  • 举报
回复
等等啊,这是c++还是c?我正在努力中
98440622 2004-10-12
  • 打赏
  • 举报
回复
不会吧?没人做过吗?!
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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