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

在这里插入图片描述

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();//回溯
   }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL AND OR 运算符

AND & OR 运算符用于基于一个以上的条件对记录进行过滤。 如果第一个条件和第二个条件都成立&#xff0c;则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个成立&#xff0c;则 OR 运算符显示一条记录。 下面是选自 "students" 表的数据&a…

Linux为何是软件开发专业人员的心头爱-Robotics Ubuntu

Linux与Windows都是十分常见的电脑操作系统&#xff0c;相信你对它们二者都有所了解&#xff01;在你的使用过程中&#xff0c;是否有什么事让你觉得在Linux上顺理成章&#xff0c;换到Windows上就令你费解&#xff1f;亦或者关于这二者你有任何想要分享的&#xff0c;都可以在…

13.Netty源码之Netty中的类与API

highlight: arduino-light ServerBootstrap Bootstrap 意思是引导&#xff0c;一个 Netty 应用通常由一个 Bootstrap 开始&#xff0c;主要作用是配置整个 Netty 程序&#xff0c;串联各个组件&#xff0c;Netty 中ServerBootstrap 是服务端启动引导类。 java //泛型 AbstractB…

【C语言day06】

逻辑或运算如果前表达式为真&#xff0c;后表达式不计算&#xff0c;第一次循环时i为0&#xff0c;执行i&#xff0c;第二次循环时i为1&#xff0c;是个真值&#xff0c;不再执行i&#xff0c;也就死循环了 在C语言中&#xff0c;一个函数如果不写返回值类型&#xff0c;那么就…

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

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

IRIS搭建docker

之前把web实现了docker&#xff0c;开发或测试环境可能需要开发自己搭数据库&#xff0c;为了方便使用&#xff0c;把数据库也做一个docker。 由于原生的CentOS我还有改yum仓库&#xff0c;所以这次从之前lis搞的改好yum的镜像开始&#xff08;从改好yum的lisnew的镜像创建lis…

SkyWalking链路追踪-搭建-spring-boot-cloud-单机环境 之《10 分钟快速搭建 SkyWalking 服务》

首先了解一下单机环境 第一步&#xff0c;搭建一个 Elasticsearch 服务。第二步&#xff0c;下载 SkyWalking 软件包。第三步&#xff0c;搭建一个 SkyWalking OAP 服务。第四步&#xff0c;启动一个 Spring Boot 应用&#xff0c;并配置 SkyWalking Agent。第五步&#xff0c;…

python_day15_闭包

闭包 def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")return innerfunc_1 outer("####") print(type(func_1)) func_1("jsy")func_2 outer("$$$$$") func_2(hello)nonlocal关键字&#xff0c;在闭包中…

element中el-input组件限制输入条件(数字、特殊字符)

1、只能输入纯数字 <el-input v-model"aaa" type"text" input"(v)>(aaav.replace(/[^\d]/g,))" /> 2、只能输入纯数字和小数&#xff08;比如&#xff1a;6.66&#xff09; <el-input v-model"aaa" type"text&quo…

座舱域控进入“上车”加速期,中国芯片的狂飙时代来了?

智能座舱成为了全球芯片厂商竞逐的下一个战场。 进入2023年&#xff0c;联发科官宣与英伟达合作开发集成CPU粒芯的汽车SoC&#xff0c;为下一代软件定义汽车提供全套车载人工智能座舱解决方案&#xff1b;AMD在特斯拉座舱落地后&#xff0c;与亿咖通在智能座舱领域达成了合作&…

Linux 学习记录56(ARM篇)

Linux 学习记录56(ARM篇) 本文目录 Linux 学习记录56(ARM篇)一、总线概念1. 总线2. 串行总线3. 并行总线4. 单工/半双工/全双工5. 同步6. 异步 二、串口(UART)1. 串口配置信息2. 串口通信协议(异步串行全双工总线)3. 框图分析4. 使能串口5. GPIO的复用模式6. RCC时钟7. UART寄存…

面向对象编程:深入理解抽象类和关键字

文章目录 1. 关键字1.1 static1.2 final1.3 static final 2. 抽象类2.1 抽象类的推导过程2.2 抽象类能否创建对象&#xff1f;2.3 抽象类的意义2.4 判断 3. 案例&#xff1a;计算圆形和长方形的周长及面积 在Java编程中&#xff0c;我们经常会遇到一些特殊的关键字和概念&#…

ChatGPT把python 的import和from讲明白了

文章目录 1、import&#xff1a;import关键字用于导入整个模块&#xff0c;您可以使用该模块中的所有对象。语法如下&#xff1a;2、from ... import ...&#xff1a;from ... import ... 语法用于从模块中导入特定的对象&#xff0c;而不是导入整个模块。您可以通过这种方式选…

14、php面向对象3(final、显示调用父类构造方法、static静态变量与方法)

1、如果父类中的方法被声明为 final&#xff0c;则子类无法覆盖该方法。如果一个类被声明为 final&#xff0c;则不能被继承。 <?php class BaseClass{public function test(){echo "BaseClass::test() called".PHP_EOL;}final public function moreTesting(){e…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看公司公告&#xff0c;查看设备&#xff0c;设备入库&#xff0c;查看通讯录&#xff0c;会议室预约&#xff0c;申请出入&#xff0c;申请请假等功能。管理员可以对员工信息&#xff0c;会…

Makefile常用函数

目录 字符串替换函数&#xff1a;subst 模式字符串替换函数&#xff1a;patsubst 去空格函数 strip 查找字符串函数 findstring 过滤函数 filter 反过滤函数 filter-out 排序函数 sort 取目录函数 dir 取文件函数 notdir 取后缀函数 suffix 取前缀函数 basename 加…

elementUI this.$confirm 文字大小样式

dangerouslyUseHTMLString:true // message部分 以html片段处理 customClass //MessageBox 的自定义类名 整个comfirm框自定义类名 cancelButtonClass // 取消按钮的自定义类名 confirmButtonClass // 确定按钮的自定义类名<style> .addcomfirm{width: 500px; } .a…

selenium的java方式打开IE浏览器

1.下载软件Selenium Driver 官方下载地址&#xff1a; ​ https://www.selenium.dev/downloads/解压selenium-java-3.141.59.zip文件到java项目 seleniumDemo&#xff0c;并降解压的文件放入依赖中&#xff08;1&#xff09;双击项目的src打开项目结构&#xff0c;或右键-打开…

易班开放应用授权重定向,出现跨域的解决方案

问题描述 今天开发H5网站需要接入易班&#xff0c;经过易班授权然后重定向&#xff08;code: 302&#xff09;&#xff0c;使用axios发请求&#xff0c;但是前后端均配置跨域的情况下&#xff0c;不管怎么弄都是一直跨域 但是我们看network&#xff0c;network中对应请求的res…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展&#xff0c;外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业&#xff0c;可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化&#xff0c;我们在这里提供了一些提…