C++ P1379 八数码难题

本文介绍了使用C++解决经典算法题目P1379——八数码难题,通过hash配合广度优先搜索(BFS)策略进行求解,并详细解析了代码实现过程。
摘要由CSDN通过智能技术生成

题目:P1379 八数码难题

经典算法教材题目,然后我决定用 hash + BFS 搞一下,解释代码附上:

# include <iostream>
# include <string>
using namespace std;
string strat, end = "123804765", que[1000000]; //strat输入和取队列头,end终点,que队列 
int move[5] = {0,1,-1,3,-3}, from, to, lest[1000000];//move移动方向,from队列头,to队列尾,lest存步数 
bool vis[10000000]; // 字符串对应hash值在vis里是否有过 
int hash(string s) { // 求字符串的hash值
	long long ans = 0;
	for(int i = 0; i < s.size(); i++) ans = ans * 33 + s[i] - '0'; // 这里我用hash time 33,自己百度了解 
	return ans % 10000000; // mod 10000000 ,因为我vis开的也那么大,开小点过不了 
}
string swop(int i, int j, string s) { // 在s串中,交换i和j位置的值 
	char t = s[i]; s[i] = s[j]; s[j] = t; return s;
}
int main() {
	cin &g
以下是使用A*算法求解八数码问题的Python代码示例: ```python from queue import PriorityQueue # 计算曼哈顿距离 def manhattan_distance(state): distance = 0 for i in range(3): for j in range(3): if state[i][j] != 0: distance += abs(i - (state[i][j] - 1) // 3) + abs(j - (state[i][j] - 1) % 3) return distance # A*算法求解八数码问题 def solve_puzzle(start_state, goal_state): # 定义open表和close表 open_queue = PriorityQueue() open_queue.put((manhattan_distance(start_state), start_state, 0)) close_set = set() while not open_queue.empty(): # 取出open表中f值最小的节点 f, state, steps = open_queue.get() if state == goal_state: return steps close_set.add(str(state)) # 扩展节点 zero_row, zero_col = 0, 0 for i in range(3): for j in range(3): if state[i][j] == 0: zero_row, zero_col = i, j break for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]: new_row, new_col = zero_row + i, zero_col + j if 0 <= new_row < 3 and 0 <= new_col < 3: new_state = [row[:] for row in state] new_state[zero_row][zero_col], new_state[new_row][new_col] = new_state[new_row][new_col], new_state[zero_row][zero_col] if str(new_state) not in close_set: open_queue.put((manhattan_distance(new_state) + steps + 1, new_state, steps + 1)) return -1 # 无解情况 # 测试 start_state = [[2, 8, 3], [1, 6, 4], [7, 0, 5]] goal_state = [[1, 2, 3], [8, 0, 4], [7, 6, 5]] steps = solve_puzzle(start_state, goal_state) if steps == -1: print("无解") else: print("最少需要%d步" % steps) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值