leetcode 79 单词排序

和以前做的岛的题类似,但还是折腾了一会,关键问题,第一个,使用一个标志数组来实现是否经过的标志,第二个,将某点置为1之后,完成周边节点的搜索之后,将该节点变为0,很巧妙,贴代码

 1 class Solution {
 2 public:
 3     bool exist(vector<vector<char>>& board, string word) 
 4     {
 5         int m = board.size();
 6         int n = board[0].size();
 7         for(int i = 0 ; i < m ; i++)
 8         {
 9             for(int j = 0 ; j < n ; j++)
10             {
11                 if(board[i][j] == word[0])
12                 {
13                     vector<vector<int>> visited(m,vector(n,0));
14                     if(dfs(board,visited,i,j,0,word))
15                     return true;
16                 }                
17             }
18         }
19         return false;
20     }
21     bool dfs(vector<vector<char>>& board,vector<vector<int>>& visited,int i,int j,int num,string word)
22     {
23         int m = board.size();
24         int n = board[0].size();
25         if(board[i][j] != word[num])
26         return false;
27         else if(num == word.length()-1)
28         return true;
29         else
30         {
31             visited[i][j] = 1; 
32             bool if_search = false;
33             if(i+1<m && visited[i+1][j] != 1)
34             if_search = if_search || dfs(board,visited,i+1,j,num+1,word);
35             if(i-1>=0 && visited[i-1][j] !=1)
36             if_search = if_search || dfs(board,visited,i-1,j,num+1,word);
37             if(j+1<n && visited[i][j+1] != 1)
38             if_search = if_search || dfs(board,visited,i,j+1,num+1,word);
39             if(j-1>=0 && visited[i][j-1] != 1)
40             if_search = if_search || dfs(board,visited,i,j-1,num+1,word);
41             visited[i][j] = 0;
42             return if_search;
43         }
44     }
45 };

对于方向的处理可以使用vector<pair<int,int>>来实现,通过循环实现所有方向遍历,出现特殊情况也可以跳出循环。

posted @ 2021-08-24 11:48  zhaohhhh  阅读(62)  评论(0)    收藏  举报