【原】八数码问题(8-puzzle Problem)

问题描述:

       有一个3×3的棋盘,其中有0~8九个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态步数最少的解。

       解决八数码问题的常用方法为图搜索法,可用广度优先、深度优先和A*算法实现,其中A*算法又因估价函数的不同而有着不同的搜索时间。

程序说明:

       在本程序中,用A*算法分别实现了八数码问题,其中A*算法的估价函数选择的是“不在位”数和当前层数之和,初始状态和目标状态均可由用户设定,初始状态和目标状态由文件读入(test.txt):

初始状态:

2 8 3
1 6 4

7 0 5

目标状态:

1 2 3
8 0 4

7 6 5

程序的输出为:

输出

 程序为:

八数码问题(8-pullza)

 

将程序改了下,使用了优先队列和哈希式查找,使在OPEN表找最小f值的时间缩小至NlogN,而且在扩展节点的时候判断节点是否已经扩展过的时间为o(1)了

输入:

test.txt

输出:

result.txt

 程序是改出来的,没有一气呵成的感觉

 Code

 这个程序在visual studio  2008 中运行还是有问题的,如果在g++编译器就没有问题,很复杂的都可以算出来

 因为是只是写程序,对程序有所研究,对问题本身没有研究,应该还有很多可以优化的地方

你可能感兴趣的:(问题)