剑指offer12 矩阵中的路径 13 机器人的运动范围 34.二叉树中和为某一值得路径

news2024/11/26 9:28:04

在这里插入图片描述

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int row=board.size(),col=board[0].size();
        int index=0,i=0,j=0;
        if(word.size()>row*col) return 0;
        //vector<vector<int>> visit[row][col];//标记当前位置有没有被访问过
        vector<vector<int>> visit(row,vector<int>(col));
        bool flag=1;
        while(i<row&j<col)
        {
                cout<<"board[i][j]: "<<board[i][j]<<endl;
                if(board[i][j]==word[index])
                {
                    flag=1;
                    if(index==word.size()-1) return 1;
                    cout<<word[index]<<endl;
                    index++;
                    visit[i][j]=1;
                    if(i-1>=0&&board[i-1][j]==word[index]&&visit[i-1][j]!=1)
                    {
                        cout<<"上"<<endl;
                        i=i-1;
                        j=j;
                    }
                    else if(i+1<row&&board[i+1][j]==word[index]&&visit[i+1][j]!=1)
                    {
                        cout<<"下"<<endl;
                        i=i+1;
                        j=j;
                    }
                    else if(j-1>=0&&board[i][j-1]==word[index]&&visit[i][j-1]!=1)
                    {
                        cout<<"左"<<endl;
                        i=i;
                        j=j-1;
                    }
                    else if(j+1<col&&board[i][j+1]==word[index]&&visit[i][j+1]!=1)
                    {
                        cout<<"右"<<endl;
                        i=i;
                        j=j+1;
                     }
                 }
                else 
                {
                 if(j==col-1&&i<row)//如果到了一行的最后面就调转到下一行 大前提是找不到word[index]相等
                 {
                     cout<<"最末尾的 "<<board[i][j]<<endl;
                     i++;
                     j=0;
                 }
                 else j++;
                }
        }  
        return 0;
    }
};

//写的有点问题,暂时想不到怎么改,先放着,通过用例71/83 卡住的是abcd 但是改了又有问题
无语 看了 答案 都写不对 在类成员里面定义了row和col 就不要重复定义了 不然不知道为什么就开始发疯

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        rows=board.size();
        cols=board[0].size();
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                if (dfs(board,word,i,j,0)) return true;
            }
        }
        return false;
    }
private:
    int rows,cols;
    bool dfs(vector<vector<char>>& board,string word,int i,int j,int k)
    {
        if(i>=rows||i<0||j>=cols||j<0||board[i][j]!=word[k]) return false;
        if(k==word.size()-1) return true;
        board[i][j]='\0';
        bool res=dfs(board,word,i+1,j,k+1)||dfs(board,word,i-1,j,k+1)
               ||dfs(board,word,i,j+1,k+1)||dfs(board,word,i,j-1,k+1);
        board[i][j]=word[k];
        return res;
    }
};

在这里插入图片描述
先贴出蠢货写出来的东西 审题也审不明白 机器人只能上下左右走 不能一行一行遍历 菜鸟总是这样 自己把自己搞破防
通过用列46/51

class Solution {
public:
    int movingCount(int m, int n, int k) {
        int index=0;
        for(int i=0;i<m;i++)
        {
            if(add(i)>k) break;
            for(int j=0;j<n;j++)
            {
                if(add(j)>k) break;
                int sum=add(i)+add(j);
                if(sum<=k) 
                {
                    index++;
                    cout<<sum<<endl;
                }
            }
        }
        return index;
    }
private:
   int add(int x)
   {
       int sum=0,num=0;
       while(x)
       {
           num=x%10;
           x=x/10;
           sum+=num;
       }
       return sum;
   }
};

问题出在哪里呢!!!! 就是比如【10,0】虽然数位之和等于1,但是无法通过【9,0】或者其他走过去,假设k=1的话,也就是他妈的他有障碍物啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
aaaa继续做就是要判断边界条件啊啊啊啊啊啊啊啊啊啊啊啊就是判断他是否能进入4个相邻的格子
首先0,0必定可以嗷,check[0,0]置为1。0,0能走到0,1和1,0,那对于0,1和1,0两个点来说,就是判断他们的上面i-1和左边j-1是否可以走,如果可以那就可以从左边和上面分别走过来,能走到当前这个点就置为1,然后左边和上面能走的点都走了之后,还有两个方向没有判断 ,再来判断能不能从右边(i+1)走到左边,下面(i+1)走到上面,如果能走到当前点,就置为1,最后有多少个1,就有多少个机器人能走的格子。

class Solution {
public:
    int movingCount(int m, int n, int k) {
        int index=0;
        int check[m][n];
        //不能直接写check[m][n]也不能check[m][n]={0},第一次无法保证元素全为0 ,第二个会报错
        memset(check,0,sizeof(check));
        //memset进行内存清零,可以将一块内存设置为指定的值
        check[0][0]=1;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                int sum=add(i)+add(j);
                if(sum<=k) 
                {
                    if(i-1>=0&&check[i-1][j]==1||j-1>=0&&check[i][j-1]==1) check[i][j]=1;
                }
            }
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                int sum=add(i)+add(j);
                if(sum<=k) 
                {
                    if(i+1<m&&check[i+1][j]==1||j+1<n&&check[i][j+1]==1) check[i][j]=1;
                }
            }
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                int sum=add(i)+add(j);
                if(check[i][j]) 
                {
                   index++;
                }
            }
        }
        return index;
    }
private:
   int add(int x)
   {
       int sum=0,num=0;
       while(x)
       {
           num=x%10;
           x=x/10;
           sum+=num;
       }
       return sum;
   }
};

在这里插入图片描述

和上题目类似,属于典型的搜索&回溯算法
先了解一下BFS模板
不需要当前遍历到哪一层,BFS模板

while queue 不空
   cur=queue.front();
   queue.pop();
   for 结点 in cur的所有相邻节点
     if 该节点有效且没被访问过:
        queue.push(该结点)

需要确定遍历到哪一层,比如之前写过一题打印二叉链表

level=0
while queue不空:
  size=queue.size()
  while(size--){
  cur=queue.pop();
  for 结点 in cur的所有相邻结点:
    if 该节点有效且未被访问过:
       queue.push(该节点)
       }
  level++;

直接使用模板

算了dfs

class Solution {
public:
    int sum(int x){//计算数位和
        int count = 0;
        while(x){
            count += x%10;
            x /= 10;
        }
        return count;
    }
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};//左上右下
    int res = 0;
    int m , n , k;
    vector<vector<bool>>st;
    int movingCount(int _m, int _n, int _k) {
//m行n列
//不能进入行坐标和列坐标的"数位"之和大于k的格子
//          i  +  j             > k
        m = _m, n = _n, k = _k;
        vector<vector<bool>>_st(m,vector<bool>(n));//初始化
        st = _st;
        return dfs(0,0);
    }
    
    int dfs(int x, int y){
        st[x][y]=true;
        res++;
        for(int i = 0 ;i < 4 ; i++){
            int a = x+dx[i] , b = y + dy[i];
            if(a >= 0 && a < m && b >= 0 && b < n && !st[a][b] && sum(a)+sum(b)<=k){
                dfs(a,b);//那么我们就渲染一下
            }
        }
        return res;
    }
    
};

DFS解法

class Solution {
public:
    int movingCount(int m, int n, int k) {
        vector<vector<int>> check(m,vector<int>(n,0));//球球你了祖宗啊记住这个定义方式吧
        dfs(check,m,n,k,0,0);
        return result;
    }

private:
   int result=0;
   int add(int x)
   {
       int sum=0,num=0;
       while(x)
       {
           num=x%10;
           x=x/10;
           sum+=num;
       }
       return sum;
   }
    void dfs(vector<vector<int>> &check,int m, int n, int k,int x,int y)
    {
        int sum=add(x)+add(y);
        if(x<0||x>=m||y<0||y>=n||check[x][y]==1||sum>k) return ;
        result++;
        check[x][y]=1;
        dfs(check,m,n,k,x+1,y);
        dfs(check,m,n,k,x,y+1);
    }
};

BFS解法就见鬼去吧 不想写队列啊啊啊啊
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        if(!root) return result;
        dfs(root,target);
        return result;

    }
private:
   vector<vector<int>> result;
   vector<int> subresult;
   void dfs(TreeNode* root,int target)
   {
      if(!root) return ;
       subresult.push_back(root->val);
       target-=root->val;
       if(root->left==nullptr&&root->right==nullptr&&target==0)
       {
           result.push_back(subresult);
       }
       dfs(root->left,target);
       dfs(root->right,target);
       subresult.pop_back();//回溯
   }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6: 对象简写/symbol()/ Iterator/set/map/await.......

对象简写 对象名字为变量 复制对象/还有个assign方法 symbol() 这种写法用户怎么添加属性都ok 获取属性,这个方法获取symbol属性 获取属性,这个方法获取symbol和普通属性 Iterator 比较复杂,可以看视频 有迭代器的可用for..of循环 012-ES6-Iterator_哔哩哔哩_bilibili Set 它…

安防监控视频汇聚平台EasyCVR修改录像计划等待时间较长是什么原因?

安防监控视频EasyCVR视频融合汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检…

【UE5 多人联机教程】05-更改角色颜色

效果 步骤 1. 打开“BP_ThirdPersonCharacter”&#xff0c;找到角色的材质 创建材质实例 2. 在“BP_ThirdPersonCharacter”中新建一个整型变量&#xff0c;命名为“PlayerColorIndex” 勾选可编辑实例、生成时公开&#xff0c;复制选择“RepNotify” 复制选择“RepNotify”…

7.26 作业 QT

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff1a; 结果图&#xff1a; second.h: #define SECOND_H#include <QWidget> #include<QDebug> //信息调试类&#xff0c;用于打印输出的 #inc…

学C的第三十天【自定义类型:结构体、枚举、联合】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十九天【字符串函数和内存函数的介绍&#xff08;二&#xff09;】_高高的胖子的博客-CSDN博客 1 . 结构体 &#xff08;1&#xff09;. 结构体的基础知识&#xff1a; 结构…

docker-compose yml配置、常用命令

下载完docker-compose后&#xff0c;如果想使用docker-compose命令开头&#xff0c;需要创建软连接 sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose 1.docker-compose.yml文件编排 一个 docker-compose.yml 文件的顶层元素有&#xff…

线程的同步

一、互斥锁 java语言中&#xff0c;引入了对象互斥锁的概念&#xff0c;来保证共享数据操作的完整性。每个对象都对应与一个可称为“互斥锁”的标记&#xff0c;这个标记用来保证在任一时刻&#xff0c;只能有 一个线程访问该对象。关键字synchronized用来与对象的互斥锁联系。…

HTML不常用但是好用的标签

sub sup <p>这个文本包含 <sub>111</sub>文本。</p> <p>这个文本包含 <sup>上标</sup> 文本。</p>下标文本将会显示在当前文本流中字符高度的一半为基准线的下方&#xff0c;但是与当前文本流中文字的字体和字号都是一样的。…

Xilinx AXI VIP使用教程

AXI接口虽然经常使用&#xff0c;很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP&#xff0c;可以当做AXI的master、pass through和slave&#xff0c;本次内容我们看下AXI VIP当作master时如何使用。 新建Vivado工程&#xff0c;并新建block design&#xff0c;命…

YOLOv7改进:CVPR 2023 | SCConv: 即插即用的空间和通道重建卷积

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:添加 SCConv,经过测试,有效涨点。…

【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

一&#xff0e; 问题描述 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互&#xff0c;控制地图移动改变其可见区域时&#xff0c;华为地图SDK没有提供直接获取用户手势类型的API。 二&#xff0e; 解决方案 华为地图SDK的地图相机有提供CameraPosition类&…

labview 信号量实现互斥 避免竞争写

上一篇文章中描述了事件发生、集合点、通知器、信号量。 本文进一步举例描述信号量实现互斥&#xff0c;避免竞争写。 1.不用信号量的例子 图1-不用信号量的结果都不同&#xff0c;不为0 图2-不用信号量的例子&#xff0c;程序框图 2.用信号量的例子 图3-用信号量的例子&…

手工测试如何转向自动化测试

手工测试的迷茫&#xff1a;除了重复劳动&#xff0c;到底还有什么&#xff1f; 我是在2008年毕业的&#xff0c;三本的学校&#xff0c;不上不下的专业水平&#xff0c;毕业的时候&#xff0c;恰好遇到了金融危机。校园招聘里阴差阳错的巧合&#xff0c;让我走上了软件测试工…

运算放大器基础(一)

5.1.1反馈的基本概念 在电子电路中,将 输出量 (输出电压或输出电流)的一部分或全部通过一定的电路形式作用到 输入回路&#xff0c;用来影响其输入量(放大电路的输入电压或输入电流)的措施称为 反馈。具体框图如下&#xff1a;反馈类型判断 正反馈与负反馈 正反馈&…

CHI协议之DVM操作

本文部分内容参考了CHI的Cache Stashing和DVM操作_谷公子的藏经阁的博客-CSDN博客 □ 注意此处RNF发送的noncopyback data, 只有8byte; □ MN会发送两个SNP给每个RNF, 因为一个SNP&#xff0c;携带的信息不够&#xff1b; □ 如果MN具备将来自同一个源头的non-sync/sync dvmop操…

详解Mybatis之自动映射 自定义映射问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一、Mybatis中的自动映射是什么&#xff1f;二、Mybatis中的自定义映射是什么&#xff1f;三、为什…

华东师范大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 华东师范大学&#xff08;B&#xff09;考研难度&#xff08;☆☆☆☆&#xff09; 华东师范大学计算机考研招生学院是计算机科学与技术学院、软件工程学院网址和数据科学与工程学院。目前均已出拟录取名单。 华东师…

前端JS 展示上传图片缩略图(本地图片读取)

需求&#xff1a; 点击上传图片按钮&#xff0c;选择图片以后&#xff0c;不请求后端接口&#xff0c;直接将图片展示在缩略图中。 解决方案&#xff1a; 使用 FileReader 和 FileReader 中的 readAsDataURL 方法。 第一步 从input[type“file”] (上传文件标签) 里面拿到fil…

解密直播美颜SDK和滤镜算法的工作原理:如何实现实时美化效果

直播美颜已成为许多直播平台的核心功能之一。通过美颜技术&#xff0c;主播可以在直播过程中实时改善自己的外貌&#xff0c;给观众带来更好的视觉体验。而实现这一效果的关键在于直播美颜SDK和滤镜算法。 一、美颜SDK的工作原理 美颜SDK是一种集成了美颜算法的软件开发工具包…

亚马逊奥地利卖家出口额创新高!2022年突破5.5亿欧元!

近日亚马逊报告说&#xff0c;2022年奥地利中小企业的出口额达到5.5亿欧元以上&#xff0c;比上一年增长了10%&#xff0c;延续了跨境销售的趋势。去年&#xff0c;奥地利卖家在亚马逊上销售了约2000万件产品。 亚马逊宣称&#xff0c;通过其全球22个站点&#xff0c;奥地利的…