八数码难题 (codevs 1225)题解

这篇博客介绍了如何解决八数码难题,通过广度优先搜索算法寻找从初始布局到目标布局的最少移动步数。作者提出两种实现方式,一种是使用3×3数组,另一种是使用字符串表示,并讨论了它们的效率问题。为了防止超时,采用了哈希优化进行判重。样例输入和输出展示了具体的操作过程。
摘要由CSDN通过智能技术生成
【问题描述】

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

【样例输入】

    283104765

【样例输出】

     4

【解题思路】

     这题要求最少步数,因此为广度优先搜索,用队列实现。最简单的方法就是直接将每种状态存入3×3的数组中,然后将空格往四个方向移动,直至目标状态。

    不过,让我们来看一看样例。

    按往常来说,如果是存入3×3的数组中,那么样例中应该是  2 8 3      

                                                                             1 0 4

                                                                             7 6 5 

    可是,样例却是一串数字,且中间没有空格,那么,这就给了我们一种思路,以字符串的形式存入,然后搜索,与目标状态比较时也方便一些。那么我们就换成字符串来搜索,但是字符串中要注意一下,第三位不能移到第四位,第四位不能移到第三位,因此,我们需要对该数字进行判断,看它属于哪一列,然后再搜索。

    不过,这两种方式都会超时(在输出结果的步数比较大的时候),因此,我们需要判重,然而,直接开一个12345678-876543210的布尔型数组会超时,所以,这里我们用到了哈希优化。

【代码实现】

  1 type rec=record
  2      s:string;
  3      s1,dep:longint;
  4 end;
  5 const di:array[1..4] of longint=(-1,-3,3,1);
  6       c:string='123804765';
  7 var a:array[1..100000] of rec;
  8     b:string;
  9     f,r,i,j,k,x:longint;
 10 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值