C++ P1379 八数码难题

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目: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 >> strat;
	if(strat == end) { cout << 0; return 0; } // 特殊处理,输入的串就是终点的时候 
	vis[hash(que[1] = strat)] = true; from = 1; to = 1; //strat入队,对应vis设true,f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值