mathe 发表于 2011-6-2 11:21:48

另外前面部分行的状态数目是否会小很多?有没有统计过?

mathe 发表于 2011-6-2 11:36:34

另外其实程序里面用到整形数实际上应该只用到加法运算,所以简单扩充到128比特的整数也应该不难

KeyTo9_Fans 发表于 2011-6-2 11:56:16

前面部分行的状态数目一直都在剧烈增加。

当行数$n$较接近列数$m$时,增速才比较缓慢。

直到$n-m>4$时,状态数才稳定下来。

所以$n/2$行的状态数远比$n$行的状态数少。

附件是C++源代码。

在Linux系统下可能要稍加修改,比如数据类型__int64要改成long long,输出语句%I64u要改成%llu,以及输入输出文件的路径等。

#####

扩充成128比特的整数要占用更多的空间,这部分空间也要在硬盘上读写的,所以硬盘空间和运行时间都会增加。

mathe 发表于 2011-6-2 13:39:11

现在开始运行10 8这个输入参数了。
为什么程序最后添加了一个scanf(&h);导致程序运行完毕后我以为还没有终止。
另外二进制文件使用fprintf和scanf读写数据比较有趣,被我改成fwrite/fread了(前面以为程序出错是由于它)

mathe 发表于 2011-6-2 16:30:16

应该计算到8*5了(显示第三排,这时状态数目超过2G,好像显示溢出了,因为状态数突然变小了,这个应该对计算没有影响吧?)

mathe 发表于 2011-6-2 19:08:42

你的初始状态为什么是
        b=2;
        b=2;
这里状态2表示什么?
是不是这些待定状态之间的连线还没有考虑进去?

mathe 发表于 2011-6-2 22:08:32

将数据用hash散列到文件可能不如选择固定几个连续位置的值作为文件名更加好
由于每次添加一个格子仅改变少量位置取值,这样可以保证每个文件数据仅产生出少量文件的数据,可以改善数据缓存的效率(另外每个文件数据产生完毕即可排序压缩)

KeyTo9_Fans 发表于 2011-6-2 22:37:20

我把结果直接输出到窗口里了。

程序运行完毕之后会自动关闭窗口。

为了不让窗口关闭,最后添加一个scanf卡住。

0表示这个格子未到达过,1表示这个格子的两端都确定了,不能再次连接到该格子。

大于1的数表示这个格子已经确定了一端,另一端未确定。

我们用相同的数字表示两个格子相连。

"b=2;b=2;"表示这两个格子都已经确定了一端,并且它们是相连的。

程序的运行时间主要由读写硬盘的数据量决定,缓存的效率不是主要问题。

mathe 发表于 2011-6-3 06:23:06

文件数据真正读写之前是存在缓存(内存)里面的,这个对程序效率会有影响的。
现在程序已经输出8*6和8*7的数目分别为55488142和34524432316
而且好像状态数目已经稳定下来了,看来到明天就可以得出8*10的结果

xbtianlang 发表于 2011-6-3 12:35:44

C++代码,看起来跟天书差不多。很多地方还是想不明白,需要恶补!
不知道有没有办法证明4*N的为什么无解啊。
页: 1 2 [3] 4 5 6 7
查看完整版本: 马踏棋盘回路计数问题