Boggle

本文介绍了Boggle游戏的解题思路,通过将棋盘建模为图,使用深度优先搜索配合前缀树(Trie)进行单词查找。在搜索过程中,使用特殊标记跟踪当前路径,避免重复节点,并优化字典查找效率,提高算法性能。
摘要由CSDN通过智能技术生成

1. 问题描述

princeton_algs4第四周的编程作业Boggle,一个拼字游戏。将棋盘上的字母按照限定的顺序连接,如果得到给定字典中出现的单词,则记分。
游戏说明
一个合法的单词必须满足以下条件:

  • 一个字母只能够与它的上、下、左、右、左上、右上、左下、右下8个方向上的字母相连。
  • 单词中同一个位置的字母只能出现一次。
  • 单词至少有三个字母。
  • 单词必须存在于给定的字典中。

我们要完成的任务就是:已知一个字典和一个棋盘(棋盘上每个位置的字母可以得到),找出该棋盘上的字母可以组成的所有合法单词。

2. 解决思路

2.1 对棋盘建模

我们考虑如何在棋盘上搜索单词。既然每个单词是沿着棋盘上的字母与其临接的字母一个一个串起来的,那么我们可以把棋盘看成图,棋盘上各位置的字母可以看成图中的结点,从一个字母与其能达到的另一个字母之间建立一条边,假设一个4*4大小的棋盘可以构成如下的无向图。
根据棋盘构成的图
其实这里我们不用真正构建一幅图,我们的主要目的是以某个字母为起点时,要很方便的得到它所有的临接点来组成单词,因此我们真正需要的是一个临接表。这里我用了一个数组来存储Bag类型的数据,一个Bag存储的是一个字母的所有临接字母。

rows = board.rows();
cols = board.cols();
adj = (Bag<Integer>[]) new Bag[rows*cols];  

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        int v = i*cols + j;
        adj[v] = new Bag<Integer>();
        if (checkWIsValid(i-1, j)) adj[v].add((i-1) * cols + j)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值