Leetcode中级算法-搜索(DFS,BFS)

题目1 : 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
[‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’]
]

给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.

解题思路:简单DFS,注意边界条件的判断和点的回溯(index和visted)

#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution
{
  public:
    string str;
    vector<vector<char>> map;
    vector<vector<bool>> visted;
    int index = 1;
    int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    bool DFS(int x, int y, int deep)
    {
        auto row = map.size();
        auto col = map[0].size();
        auto len = str.size();

        if (deep == len && map[x][y] == str[len - 1])//这里是两个条件
        {
            return true;
        }
        for (int i = 0; i < 4; i++)
        {
            auto xx = x + dir[i][0];
            auto yy = y + dir[i][1];
            if (xx < 0 || xx >= row || yy < 0 || yy >= col || visted[xx][yy] || map[xx][yy] != str[index])
                continue;
            else
            {
                index++;
                visted[xx][yy] = true;
                if (DFS(xx, yy, deep + 1))
                    return true;
                visted[xx][yy] = false ;
                index--;
            }
        }
        return false;
    }
    bool exist(vector<vector<char>> &board, string word)
    {
        auto row = board.size();
        auto col = board[0].size();

        vector<bool> temp(col, false);
        vector<vector<bool>> temp_visted(row, temp);

        str = word;
        map = board;
        visted = temp_visted;

        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                if (visted[i][j] == false && board[i][j] == word[0])
                {
                    visted[i][j] = true;
                    if (DFS(i, j, 1))
                        return true;
                    visted[i][j] = false;
                }
            }
        }
        return false;
    }
};
posted @ 2018-08-11 09:55  Tattoo_Welkin  阅读(110)  评论(0编辑  收藏  举报