递归练习题(四)

目录

一:单词搜索

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

};
相关推荐
放下华子我只抽RuiKe510 小时前
算法的试金石:模型训练、评估与调优的艺术
人工智能·深度学习·算法·机器学习·自然语言处理·数据挖掘·线性回归
oem11010 小时前
C++中的享元模式实战
开发语言·c++·算法
流云鹤10 小时前
每日一题0316
算法
leonkay10 小时前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
雅欣鱼子酱10 小时前
Type-C供电PD协议取电Sink芯片ECP5702,可二端头分开供电调整亮度,适用于LED灯带户外防水超亮灯条方案
c语言·开发语言
颜酱11 小时前
BFS 与并查集实战总结:从基础框架到刷题落地
javascript·后端·算法
casual~11 小时前
第?个质数(埃氏筛算法)
数据结构·c++·算法
Elnaij11 小时前
从C++开始的编程生活(20)——AVL树
开发语言·c++
hanbr11 小时前
【C++ STL核心】vector:最常用的动态数组容器(第九天核心)
开发语言·c++
仰泳的熊猫12 小时前
题目2308:蓝桥杯2019年第十届省赛真题-旋转
数据结构·c++·算法·蓝桥杯