First we try, then we trust

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

续第一部分《华容道系列-开篇

 

四、 棋盘布局存储方案

华容道棋盘布局经过优化后可以存储在4个字节中,确切的说是3字节零两个二进制位(10子)布局。经过简单调整后,也可以将12子布局存储在4个字节当中。不过12子布局的走法过于简单,所以在今后的文章中,布局全部指10子布局,软件只针对10子布局开发。设计方案如下:

 

上图演示了两种布局的存储结构。棋子总共分成5类,分别是最大子、横放、竖放、卒以及空格(在这里将空格认为是一个棋子)。将最大子记做A,单独存储。其它4种棋子可以使用两个二进制位来描述,分别是:

00-空格, 01-卒, 10-竖放, 11-横放

一个布局共有此类子(含空格)11个,共占用22个二进制位。A子用4个二进制位来记录(可表示16种变化),其取值可以是十进制1~12中的一个,表示A子在所有棋子中的位置。因此,一盘布局仅需26个二进制位,其余6个二进制位作为保留位。

在棋子排放上,从棋盘左上角开始,每个棋子的摆放位置都选取最小可用的行、列坐标位置作为摆放位置(如图),并在合适的时候插入A子(根据A的顺序号)。

这样,一个布局仅需一个Int32就可以记录下来。在后面的内容中,不管是建立AVL平衡树还是广度优先的搜索算法都是针对Int32进行的。一个布局可以和一个整数相互转换(在后续内容中将给出代码实现方案)。


五、 基本算法描述

华容道求解过程不外乎罗列所有可能的走法,采用广度优先的树形结构进行计算机搜索,当搜索到符合解的布局时便终止搜索。并从树型结构中追溯出解题的全过程。因此需要每个布局保留一个指向上步布局的引用。为了保证合理的内存使用,每次都要检索当前布局是否在前面已经出现过,如果有重复布局,则自动剔除。用图形的方式描述出来便是:

在后续的章节中,我们将应用数据结构的知识来构建华容道求解过程中所需要的数据结构,内容将涉及链表、树、AVL平衡树、堆栈等结构,尽量在确保合理内存占用的情况下简化计算机求解过程。

posted on 2004-12-10 21:00  吕震宇  阅读(9005)  评论(11编辑  收藏  举报