回溯法解决二维平面搜索问题

回溯法解决二维平面搜索问题

LeetCode 79

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

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

示例:

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

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

具体代码实现

其中有很多东西可以当做模板记住!!!

class Solution {
    
private:   
    vector>visited;
    int m,n;
    int d[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
    
    bool Area(int x,int y)
    {
         return x>=0&&x=0&&y>& board, string word,int index,int x,int y)
    {
        if(index==word.size()-1)
            return board[x][y]==word[index];
        
        if(board[x][y]==word[index])
        {
            visited[x][y]=true;
            
            for(int i=0;i<4;i++)
            {
                int newx=x+d[i][0];
                int newy=y+d[i][1];
                
                if(Area(newx,newy)&& !visited[newx][newy]&&help(board,word,index+1,newx,newy))
                    return true;
            }           
            visited[x][y]=false;
        }
        
        return false; 
    }

    
public:
    bool exist(vector>& board, string word) {
        
        m=board.size();
        if(m<=0)
            return false;
        n=board[0].size();
        
        visited=vector>(m,vector(n,false));
        
        for(int i=0;i

LeetCode 200

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

具体代码实现

其中有很多东西可以当做模板记住!!!和上面的一个题有一点点不同,基本上思想一致,都是回溯遍历的思想。

class Solution {
private:
    int m,n;
    vector>visited;
    int d[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
    bool Area(int x,int y)
    {
        return x>=0&&x=0&&y>&grid, int x,int y)
    {
        visited[x][y]=true;
        
        for(int i=0;i<4;i++)
        {
            int newx=x+d[i][0];
            int newy=y+d[i][1];
            
            if(Area(newx,newy)&&!visited[newx][newy]&&grid[newx][newy]=='1')
                help(grid,newx,newy);
            
        }
        
        return ;
 
    }

public:
    int numIslands(vector>& grid) {               
        m=grid.size();
        if(m==0)
            return 0;
        n=grid[0].size();
        
        visited=vector>(m,vector(n,false));
        
        int res=0;
        for(int i=0;i

你可能感兴趣的:(数据结构与算法)