递归练习题(四)

目录

一:单词搜索

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;
            }
        }
    }

};
相关推荐
想做小南娘,发现自己是女生喵11 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
ComputerInBook11 小时前
c 和 c++ 中的宏块(macro)
c语言·c++··宏块·宏指令
艾醒12 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
AA陈超12 小时前
004 T02 - 俯视角摄像机系统 设计文档
网络·c++·ue5·虚幻引擎
雪碧聊技术12 小时前
动态规划算法—01背包问题
算法·动态规划
bu_shuo12 小时前
c与cpp中的argc和argv
c语言·c++·算法
普贤莲花12 小时前
【2026年第29周---写于20260718】---整理,断舍离
程序人生·算法·生活
蓝创精英团队12 小时前
VCPKG 跨平台C++ 库管理器
c++·vcpkg
Reart13 小时前
Leetcode 674.最长连续递增序列 (719)
后端·算法
Aurorar0rua13 小时前
CS50 x 2024 Notes Algorithms - 02
c语言·开发语言·学习方法