zoukankan      html  css  js  c++  java
  • Careercup

    2014-05-01 02:30

    题目链接

    原题:

    Given a matrix of letters and a word, check if the word is present in the matrix. E,g., suppose matrix is: 
    a b c d e f 
    z n a b c f 
    f g f a b c 
    and given word is fnz, it is present. However, gng is not since you would be repeating g twice. 
    You can move in all the 8 directions around an element.

    题目:给定一个字母矩阵,给定一个单词,请判断从矩阵某一点出发,能否走出一条路径组成这个单词。每一步可以走8邻接的方向。

    解法:这基本就是Leetcode的原题Word Search,DFS搞定。如果矩阵太大的话,可以用BFS防止递归过深造成的栈溢出,不过效率方面就更慢了。

    代码:

     1 // http://www.careercup.com/question?id=5890898499993600
     2 class Solution {
     3 public:
     4     bool exist(vector<vector<char> > &board, string word) {
     5         n = (int)board.size();
     6         if (n == 0) {
     7             return false;
     8         }
     9         m = (int)board[0].size();
    10         word_len = (int)word.length();
    11         
    12         if (word_len == 0) {
    13             return true;
    14         }
    15         
    16         int i, j;
    17         for (i = 0; i < n; ++i) {
    18             for (j = 0; j < m; ++j) {
    19                 if(dfs(board, word, i, j, 0)) {
    20                     return true;
    21                 }
    22             }
    23         }
    24         return false;
    25     }
    26 private:
    27     int n, m;
    28     int word_len;
    29     
    30     bool dfs(vector<vector<char> > &board, string &word, int x, int y, int idx) {
    31         static const int d[8][2] = {
    32             {-1, -1}, 
    33             {-1,  0}, 
    34             {-1, +1}, 
    35             { 0, -1}, 
    36             { 0, +1}, 
    37             {+1, -1}, 
    38             {+1,  0}, 
    39             {+1, +1}
    40         };
    41         
    42         if (x < 0 || x > n - 1 || y < 0 || y > m - 1) {
    43             return false;
    44         }
    45         
    46         if (board[x][y] < 'A' || board[x][y] != word[idx]) {
    47             // already searched here
    48             // letter mismatch here
    49             return false;
    50         }
    51         
    52         bool res;
    53         if (idx == word_len - 1) {
    54             // reach the end of word, success
    55             return true;
    56         }
    57 
    58         for (int i = 0; i < 8; ++i) {
    59             board[x][y] -= 'a';
    60             res = dfs(board, word, x + d[i][0], y + d[i][1], idx + 1);
    61             board[x][y] += 'a';
    62             if (res) {
    63                 return true;
    64             }
    65         }
    66         // all letters will be within [a-z], thus I marked a position as 'searched' by setting them to an invalid value.
    67         // we have to restore the value when the DFS is done, so their values must still be distiguishable.
    68         // therefore, I used an offset value of 'a'.
    69         // this tricky way is to save the extra O(n * m) space needed as marker array.
    70         
    71         return false;
    72     }
    73 };
  • 相关阅读:
    矩阵分析及其在线性代数中的应用(3-4)
    矩阵分析及其在线性代数中的应用(1-2)
    信息检索的评价标准
    Converting Between Image Classes (matlab 中图像类之间的转换)
    Ubuntu 14.04,root the Nexus 7 (2013).
    ACM进阶计划
    matlab R2012a in ubuntu12.04
    人,绩效和职业道德
    运行及总结
    仓库管理 测试计划
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3702474.html
Copyright © 2011-2022 走看看