Princeton Algorithms, Boggle

Princeton Algorithm Assignment Boggle

普林斯頓大學算法課 Boggle

實現(xiàn)一個 Boggle 游戲玄括,由自己決定采用什么數(shù)據(jù)結構和搜索方法液荸。

基本就是字典樹(Trie)的實際應用岸蜗。

提供了 BogleBoard 類和 BoggleGame 類,可以很方便把自己寫的 Solver 給整合進去绊袋,直接編譯成可以玩的游戲,順便也驗證一下結果是否正確铸鹰。

Trie 的正確實現(xiàn)不難癌别,DFS 也很無腦,基本可以輕松拿到 80 到 90 分蹋笼,主要是性能上的優(yōu)化展姐,想要拿滿分(甚至 bonus),需要考慮:

  1. 回溯優(yōu)化:當某一個結點的沒有孩子的時候剖毯,不需要進行 DFS圾笨;
if (node.hasChild()) {
    for (int x = -1; x <= 1; x++) {
        for (int y = -1; y <= 1; y++) {
            int newRow = row + x;
            int newCol = col + y;
            if (isValid(board, newRow, newCol) && !visited[newRow][newCol]) {
                dfs(board, newRow, newCol, visited, node);
            }
        }
    }
}
  1. 單詞只包含 A 到 Z,所以直接使用 26 個結點的 Trie逊谋,比 TNT 快很多(雖然占用了更多的內存)擂达;
// Recall that the alphabet consists of only the 26 letters A through Z
// Use trie 26, more space but faster than TNT
links = new TrieNode[26];
  1. DFS 中的前綴查詢,通常會得到一致的結果, 只是每次長了一個字符胶滋,所以不需要每一次都進行前綴查詢板鬓,保存 TrieNode 的狀態(tài),在每一次 DFS 中更新究恤;
public TrieNode prefixNode(char c, TrieNode cache) {
    if (cache == null) {
        cache = root;
    }
    if (cache.contains(c)) {
        cache = cache.get(c);
    } else {
        return null;
    }
    return cache;
}
  1. 由于 Q 之后只會包含 u俭令,不存在 Qx 的情況,所以沒必要在 Trie 中存儲 Qu部宿,只需要 Q 就可以了抄腔,處理時特判 Q,跳過 u理张;
if (c == 'Q') {
    i++; // Skip "Qu"
    if (i == word.length() || word.charAt(i) != 'U') {
        // Ignore "Q" and "Qx"
        return false;
    }
}
i++;
  1. 不要使用 Set赫蛇,在 TrieNode 中增加一個標記,表示這個單詞是否被添加過涯穷,例如當訪問過了之后修改這個 TrieNode 的 added 為 true棍掐,但是注意,我們會對同一個字典(Trie)執(zhí)行多次 getAllValidWords拷况,所以僅用 true/false 不足以表示這樣的情況作煌,我們在 TrieNode 中增加一個 uid 字段掘殴,每次執(zhí)行 getAllValidWords 時增加 uid,判斷在當前 uid 下粟誓,這個單詞是不是被加入過奏寨;
public Iterable<String> getAllValidWords(BoggleBoard board) {
    answers = new ArrayList<>();
    uid++;
    // DFS
    return new ArrayList<>(answers);
}
if (node.isEnd() && node.getUid() != uid) {
  String word = node.getWord();
  if (word.length() > 2) {
      answers.add(word);
      node.setUid(uid);
  }
}
  1. 不要在 DFS 中用類似 StringBuilder 的東西,在 Trie 中構造字符串鹰服,并存在 TrieNode 中病瞳,因為 Trie 只會被構建一次,這樣之后 DFS 直接根據(jù) Node 中的字符串輸出單詞悲酷,就會快很多套菜。

參考解決方案的每秒查詢數(shù)大概在 8000 次左右,要求 reference/student ratio 小于等于 2设易,即實現(xiàn)方案的每秒查詢數(shù)大于 4000 就可以得到滿分逗柴,上面這些方案的任意組合足以達到 ratio <= 1,即每秒查詢 8000 次以上顿肺。

如果還想要獲得 Bonus(ratio <= 0.5戏溺,即每秒查詢 16000 次以上),需要額外處理:

Precompute the Boggle graph, i.e., the set of cubes adjacent to each cube. But don't necessarily use a heavyweight Graph object: To caculate the key for every point, which means key = y * width + x, then for every point, save current key's neighbors key in int[][] graph , therefore we need a letter array to map the key to the letter in board.

以下代碼獲得 Coursera 評分 100 分:訪問 GitLab倉庫屠尊、GitHub倉庫 和/或 博客 查看完整代碼旷祸。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讼昆,隨后出現(xiàn)的幾起案子托享,更是在濱河造成了極大的恐慌,老刑警劉巖浸赫,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫌吠,死亡現(xiàn)場離奇詭異,居然都是意外死亡掺炭,警方通過查閱死者的電腦和手機辫诅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涧狮,“玉大人炕矮,你說我怎么就攤上這事≌咴” “怎么了肤视?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涉枫。 經常有香客問我邢滑,道長,這世上最難降的妖魔是什么愿汰? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任困后,我火速辦了婚禮乐纸,結果婚禮上,老公的妹妹穿的比我還像新娘摇予。我一直安慰自己汽绢,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布侧戴。 她就那樣靜靜地躺著宁昭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酗宋。 梳的紋絲不亂的頭發(fā)上积仗,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音蜕猫,去河邊找鬼斥扛。 笑死,一個胖子當著我的面吹牛丹锹,可吹牛的內容都是我干的。 我是一名探鬼主播芬失,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼楣黍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棱烂?” 一聲冷哼從身側響起租漂,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颊糜,沒想到半個月后哩治,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡衬鱼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年业筏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟赫。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜胖,死狀恐怖,靈堂內的尸體忽然破棺而出抛蚤,到底是詐尸還是另有隱情台谢,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布岁经,位于F島的核電站朋沮,受9級特大地震影響,放射性物質發(fā)生泄漏缀壤。R本人自食惡果不足惜樊拓,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一纠亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骑脱,春花似錦菜枷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拥娄,卻和暖如春蚊锹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稚瘾。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工牡昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摊欠。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓丢烘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親些椒。 傳聞我的和親對象是個殘疾皇子播瞳,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容