1.14 连连看游戏设计

题意:设计连连看游戏。

这道题目最关键的问题是,连连看游戏中的寻路问题,这个寻路和以往的最短路径稍微有点不一样,这里是要找一个转弯数目最少的路径。

使用BFS进行搜索,需要重新定义一下最短路径的概念,这里的路径长短不再按照实际距离来算,而是按照转弯的数目来算,转弯数目越少,则路径越短。

算法搜索的时候也是一步一步进行移动的,从初始点出发,首先标记所有不用转弯就能直接到达的方格弯数为0,继而从这些弯数为0的方格进行扩展,标记所有弯数为1……

如此反复下去,如果弯数为2还没有找到,则表明这并不是一次有效的连接。

由于这里已经限制了弯数是要小于3的,所以笔者认为可以换一个角度考虑。

1)起点和终点同时标记各自不用转弯就能到达的方格,设分别为集合A和B,如果A∩B不为空集,那么说明起点和终点可以用0个弯或者1个弯连接,公共元素是必经之路;

2)如果没有重合的方格,那么检查A和B中x坐标或者y坐标相等的方格,尝试将两者相连,如果中间没有遮挡的话,就算连接成功,不过检查所有的都找不到,那说明连接失败。这种检查也是有技巧可取的,A和B中的元素是十字分布的,A中的竖与B中的竖对应进行检查,横同理进行对应检查,另外如果是顺序存储的话,可以利用滑动查找。

1.15 构造数独

题意:构造一个数独,9×9盘面上的已知数字满足每一行、每一列、每一个粗线宫(共9个)内的数字均含1-9,不重复。

解法一是一种暴力搜索的方法,对于一个空方格,在可能的值里面随机选一个填入,然后在下一个空方格重复这个过程,如果某种局面导致不存在可能的值,则回溯,重新选取与之前不同的可能的值。可能的值如何得到,则要看数独矩阵已经完成的情况,如果是填第一个空格,那么1-9随便哪一个都是可以的,第二个空格只要与第一个不同即可……之后可能还要考虑行列和宫的约束,所以搜索量看起来不小。

解法二是一种不完全的方法,只能取到一个全部数独的子集,不过技巧倒是挺有意思的。

posted on 2012-10-25 11:10  罗辑  阅读(198)  评论(0编辑  收藏  举报