八数码问题(bfs+哈希)

白书上给出了灰常飘逸,灰常飘逸的八数码问题的解答……上次去HFUT参加他们软件学院的校赛,居然都是白书上的原题……竟然名字也没改“八数码问题”>-<,既然允许参考纸质资料,当时还不知道神码是八数码,神码是哈希的我,原封不动抄了上去A了它……惭愧不已

日后学习了这份代码,才知道这份代码有多么飘逸……据说八数码问题是A*(A-star)算法「静态路网`最短路`估价函数。。。」的模板题。。。参见百度百科百度文库

下面给出题目:

编号为1~8的8个正方形滑块被摆成3行3列(有一个格子留空)。每次可以把与空格相邻的滑块(有公共边才算相邻)移到空格中,而它原来的位置就成为了新的空格。给定初始局面和目标局面(用0表示空格)ÿ

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
八数码问题(Eight puzzle problem)是一个经典的人工智能问题,它的目标是将一个 $3\times 3$ 的拼图中的数字按照指定顺序排列。可以使用广度优先搜索、深度优先搜索、A* 等算法求解。 在 MATLAB 中,可以使用搜索算法求解八数码问题。具体实现方法可以参考以下步骤: 1. 定义初始状态和目标状态,这两个状态都是 $3\times 3$ 的矩阵,其中 $0$ 表示空格。 2. 定义状态转移函数,即如何从一个状态转移到另一个状态。对于八数码问题,可以定义将空格上下左右移动一格为一种状态转移。 3. 实现搜索算法,可以选择广度优先搜索、深度优先搜索、A* 等算法。在实现过程中需要注意避免重复搜索已经访问过的状态。 4. 最终得到从初始状态到目标状态的一条解路径。 示例代码如下: ```matlab % 定义初始状态和目标状态 start_state = [1 2 3; 4 0 5; 6 7 8]; target_state = [1 2 3; 4 5 6; 7 8 0]; % 定义状态转移函数 move = @(state, dx, dy) move_helper(state, dx, dy); move_helper = @(state, dx, dy) ... [state(1+dx,1+dy), state(2+dx,1+dy), state(3+dx,1+dy); ... state(1+dx,2+dy), state(2+dx,2+dy), state(3+dx,2+dy); ... state(1+dx,3+dy), state(2+dx,3+dy), state(3+dx,3+dy)]; % 定义广度优先搜索算法 bfs = @(start_state, target_state, move) bfs_helper(start_state, target_state, move); bfs_helper = @(start_state, target_state, move) bfs_search(start_state, target_state, move); bfs_search = @(start_state, target_state, move) ... bfs_search_helper(Queue({start_state}), containers.Map({mat2str(start_state)}, {[]}), target_state, move); bfs_search_helper = @(queue, paths, target_state, move) ... bfs_search_helper_helper(queue, paths, target_state, move); bfs_search_helper_helper = @(queue, paths, target_state, move) ... bfs_search_helper_helper_helper(queue, paths, target_state, move); bfs_search_helper_helper_helper = @(queue, paths, target_state, move) ... bfs_search_helper_helper_helper_helper(queue, paths, target_state, move); bfs_search_helper_helper_helper_helper = @(queue, paths, target_state, move) ... bfs_search_helper_helper_helper_helper(queue, paths, target_state, move); bfs_search_helper_helper_helper_helper_helper = @(queue, paths, target_state, move) ... bfs_search_helper_helper_helper_helper_helper(queue, paths, target_state, move); function result = bfs_search_helper_helper_helper_helper_helper(queue, paths, target_state, move) if queue.isempty() result = []; else [state, path] = queue.dequeue(); if isequal(state, target_state) result = path; else for dx = [-1 0 1 0] for dy = [0 -1 0 1] if dx ~= 0 || dy ~= 0 new_state = move(state, dx, dy); if ~paths.isKey(mat2str(new_state)) new_path = [path, new_state]; queue.enqueue(new_state, new_path); paths(mat2str(new_state)) = new_path; end end end end result = bfs_search_helper_helper_helper_helper_helper(queue, paths, target_state, move); end end end % 求解八数码问题 path = bfs(start_state, target_state, move); disp(path); ``` 此代码实现了广度优先搜索算法,使用 `Queue` 类来实现队列,使用 `containers.Map` 类来实现哈希表,从而避免重复搜索已经访问过的状态。在求解过程中,程序会输出一条从初始状态到目标状态的解路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值