Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用*搜索算法解决3x3三维方块难题?_C_Algorithm_Search_A Star - Fatal编程技术网

C 使用*搜索算法解决3x3三维方块难题?

C 使用*搜索算法解决3x3三维方块难题?,c,algorithm,search,a-star,C,Algorithm,Search,A Star,我正在做作业中的一道3x3三维方块拼图题。我将用C编写代码 有26个盒子,起初,第一个地方是空的。通过滑动箱子,我必须把它们按正确的顺序排列。红色数字表示顺序正确,第27位最后必须为空。我不想让你给我密码;我在论坛上搜索,似乎我必须使用,但如何使用 你能告诉我如何使用A*算法解决这个问题吗?我应该使用什么类型的数据结构 您知道图形是如何工作的,以及A*如何在图形上找到最短路径,对吗 基本思想是,拼图的每个配置都可以被视为图中的顶点,边表示移动(通过连接移动前后的配置) 查找从原始配置到所需配置

我正在做作业中的一道3x3三维方块拼图题。我将用C编写代码

有26个盒子,起初,第一个地方是空的。通过滑动箱子,我必须把它们按正确的顺序排列。红色数字表示顺序正确,第27位最后必须为空。我不想让你给我密码;我在论坛上搜索,似乎我必须使用,但如何使用


你能告诉我如何使用A*算法解决这个问题吗?我应该使用什么类型的数据结构

您知道图形是如何工作的,以及A*如何在图形上找到最短路径,对吗

基本思想是,拼图的每个配置都可以被视为图中的顶点,边表示移动(通过连接移动前后的配置)


查找从原始配置到所需配置的一组移动可以视为路径查找问题。

将您的问题定义为状态图:
G=(V,E)
其中
V=S={(x_1,x_2,…,x_54)| 3d板可以处于的所有可能状态}
[每个数字代表3d板上的单个“正方形]。
定义
E={(v1,v2)|可以通过单步}从状态v1移动到状态v2
对于
E
的另一种定义[相同]是使用函数
后继(v)

对于v中的每个v:
successivers(v)={您可以得到的所有可能的板,从v开始有一个步骤}

对于这个问题,你还需要一个,一个很好的例子:
h(state)=Sigma(manhattan_distance(x_i)),其中i在[1,54]范围内。
基本上,它是每个数字与其目标的总和

现在,一旦我们得到了这些数据,我们就可以开始在定义的图G上运行A*,使用定义的启发式。由于我们的启发式函数是可接受的[说服你自己为什么!],因此可以保证A*找到的解决方案是最优的,因为。

查找实际路径:A*将在开发目标状态时结束。[
x_i=i
在我们前面使用的术语中]。通过使用每个节点中的
parent
字段,从目标返回到源,可以找到它的路径。

A*算法是一种路径查找算法。你能澄清一下你是想让用户还是程序解决这个难题吗?如果是用户,那么我看不出你会如何使用*。但如果是程序,也许你可以把空间想象成四处移动的物体,需要寻找路径。程序会解决问题,盒子的每一步、每一个动作都必须写入控制台。请你解释清楚一点好吗?谢谢。谢谢你的回答。我不明白你为什么把V==S从1描述到54?我是说为什么是54块?@hasan:每个立方体有9块瓷砖。因为一个立方体有6个面,并且
6*9=54
,所以整个拼图中总共有54个瓷砖。好吧,但我无法理解为什么我们对面感兴趣?我们不关心这个,不是吗?@hasan:我们不关心面,但我们关心每个瓷砖/数字的最终位置,它必须形成特定的形状。我提到“脸”只是为了解释为什么我们有54块瓷砖[x_1,…,x_54]。