算法竞赛入门经典:第七章 暴力求解法 7.18 广度优先搜索之八数码问题

本文介绍了如何使用广度优先搜索解决八数码问题,通过定义状态、编码与解码机制来避免重复状态,并利用模拟队列进行状态转移,寻找从初始状态到目标状态的最少移动步数。

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

/*
八数码问题:
编号为1~8的8个正方形滑块被摆成3行3列(有一个格子空留),如图所示。每次可以把与空格相邻的滑块(有公共边才算相邻)移到空格中,而它原来的位置就称为了
新的空格。给定初始局面和目标局面(用0表示空格格),你的任务是计算出最少的移动步数。如果无法达到目标局面,则输-1.

2	6	4     8	 1	5
1	3	7	  7	 3	6
	5	8     4     2
思路:
1 用广度优先搜索,难道得用9个位置剪枝才能达到限定条件?,初始状态和结束状态难道都是一群,而不是能用一个结构体表示,用二维数组表示。
2 八数码问题时图上的最短路径问题,每个状态就是9个各自中的滑块编号(从上到下,从左到右把他们放到一个包含9个元素的数组中)
*/

/*
关键:
typedef int State[9];
State s[100];
int memcmp(void* buf1,void* buf2,size_t count);//比较buf1与buf2的前count个字符,0表示相等
void* memcpy(void* to,const void* from,size_t count);//从to中拷贝前count个字符到to中
//typedef int State[9];//
//State s[100];
//s的素具类型是长度为100的数组,数组元素s[i]的数据类型是State是长度为10的数组,等同于定义了一个二维数组s[100]=iArr[100][9],数组元素师int
//int iarr[100][10],arr的数据类型是长度为100的数组,数组元素师arr[i],arr[i]的数据类型是长度为10的数组,数组元素师int
*/

/*
关键:
1 typedef int State[9];//s的素具类型是长度为100的数组,数组元素s[i]的数据类型是State是长度为10的数组,等同于定义了一个二维数组s[100]=iArr[100][9],数组元素师int
                     //int iarr[100][10],arr的数据类型是长度为100的数组,数组元素师arr[i],arr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值