递归练习题(四)

目录

一:单词搜索

1.1题目

1.2算法原理

1.3代码

二:黄金矿工

2.1题目

2.2算法原理

2.3代码

三:不同路径III

3.1题目

3.2算法原理

3.3代码


一:单词搜索

1.1题目

题目链接:https://leetcode.cn/problems/word-search/


1.2算法原理


1.3代码

cpp 复制代码
class Solution {
public:
    bool vis[7][7];//查看该位置是否已经走过
    int m = 0 ,n = 0;
    string word;
    bool exist(vector<vector<char>>& board, string _word) 
    {
        m = board.size();
        n = board[0].size();
        word = _word;
        //确定矩阵中的第一个位置
        for(int i = 0; i < m; i++)
            for(int j = 0; j <n; j++)
            {
                if(board[i][j] == word[0])
                {
                    vis[i][j] = true;
                    if(dfs(board,i,j,1)) return true;
                    vis[i][j] = false;
                }
            }

        return false;
    }

    int dx[4] = {0,0 ,-1,1};
    int dy[4] = {-1,1,0,0};
    bool dfs(vector<vector<char>>& board,int i,int j, int pos)
    {
        if(pos == word.size()) return true;

        //使用向量组标记方位
        for(int k = 0; k < 4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && board[x][y] == word[pos])
            {
                vis[x][y] = true;
                if(dfs(board,x,y,pos+1)) return true;
                vis[x][y] = false;
            }
        }
        
        return false;
    }
};

二:黄金矿工

2.1题目

题目链接:https://leetcode.cn/problems/path-with-maximum-gold/


2.2算法原理

本题的算法原理的思路和代码的逻辑和上一题的单词搜索是一致的


2.3代码

cpp 复制代码
class Solution {
public:
    bool vis[16][16];
    int sum = 0,ret = 0;
    int m = 0, n = 0;
    int getMaximumGold(vector<vector<int>>& grid) 
    {
        m = grid.size();
        n = grid[0].size();

        for(int i = 0; i < m; i++)
            for(int j = 0; j < n;j++)
            {    
                if(grid[i][j] != 0)
                {
                    vis[i][j] = true;
                    sum += grid[i][j];
                    dfs(grid,i,j);
                    vis[i][j] = false;
                    sum -= grid[i][j];
                }
            }
        
        return ret;
    }

    int dx[4] = {0,0,-1,1};
    int dy[4] = {-1,1,0,0};
    void dfs(vector<vector<int>>& grid,int i, int j)
    {
        for(int k = 0; k < 4;k++)
        {
            int x = i + dx[k],y = j+dy[k];
            if(x >= 0&& x <m &&y >= 0 && y < n && !vis[x][y]&& grid[x][y] != 0)
            {
                sum += grid[x][y];
                vis[x][y] = true;
                dfs(grid,x,y);
                sum -= grid[x][y];
                vis[x][y] = false;
            }
        }

        ret = max(ret,sum);
    }
};

三:不同路径III

3.1题目

题目链接:https://leetcode.cn/problems/unique-paths-iii/description/


3.2算法原理

算法原理和前面两个题都是相似的

1.首先遍历数组,找到起点

2.然后从起点出发,上下左右四个方向找空方格,直到找到终点数字2

细节:1.题目要求每一个空方格都要走一遍,所以刚开始可以先遍历一遍查看空方格总量,然后深度遍历的时候,step++,直到step和之前统计的数量相等为止

2.不能走重复的空格子,使用bool数组标记已经走过的位置

3.四个方向使用向量数组

4.递归出口:step == 空方格+起点终点 并且位于数字2的方格

5.剪枝:方格为-1时剪枝


3.3代码

cpp 复制代码
class Solution {
public:
    int m = 0, n = 0;
    bool vis[21][21];
    int dx[4] = {0,0,-1,1};
    int dy[4] = {-1,1,0,0};
    int ret = 0, step = 1,cont = 0;

    int uniquePathsIII(vector<vector<int>>& grid) 
    {
        m = grid.size();
        n = grid[0].size();
        int bx = 0, by =0;

        for(int i = 0; i < m;i++)
            for(int j = 0; j <n; j++)
            {
                //统计路径长度
                if(grid[i][j] == 0)
                {
                    cont++;
                }
                else if(grid[i][j] == 1)
                {
                    bx = i;
                    by = j;
                }
            }

        cont += 2;//加上路径的起点和终点
        vis[bx][by] = true;
        dfs(grid,bx,by);

        return ret;
    }

    void dfs(vector<vector<int>>& grid,int i, int j)
    {
        if(grid[i][j] == 2)
        {
            if(cont == step) ret++;
            return;
        }

        for(int k = 0; k < 4;k++)
        {
            int x = i +dx[k],y = j + dy[k];
            if(x >= 0 && x < m&& y>=0 && y < n  &&!vis[x][y] && grid[x][y] != -1)
            {
                vis[x][y] = true;
                step++;
                dfs(grid,x,y);
                step--;
                vis[x][y] = false;
            }
        }
    }

};
相关推荐
一匹电信狗1 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
鱼跃鹰飞2 小时前
Leetcode会员尊享100题:270.最接近的二叉树值
数据结构·算法·leetcode
Queenie_Charlie2 小时前
小陶的疑惑2
数据结构·c++·树状数组
梵刹古音3 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
筵陌3 小时前
算法:模拟
算法
梵刹古音3 小时前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式
Queenie_Charlie4 小时前
小陶与杠铃片
数据结构·c++·树状数组
We་ct4 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
renhongxia14 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归
CoderCodingNo4 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法