首页 > 其他分享 >回溯 78.子集 200. 岛屿数量

回溯 78.子集 200. 岛屿数量

时间:2023-04-28 16:45:02浏览次数:48  
标签:200 nums int vector grid 回溯 path 78

回溯算法

  • 为什么

    • for循环嵌套很难解决
    • 解决问题 当问题需要 "回头",以此来查找出所有的解的时候
      • 排列组合
      • 切割(切割字符串)
      • 子集 把子集列出来
      • 棋盘 N皇后/解数独
  • 是什么

    • 只要有递归, 就有回溯
    • 也是一种纯暴力搜索算法
    • 可以抽象成一个树形结构
    • 递归函数没有返回值(backtrading)
  • 怎么样

    • 最好抽象成一个图形结构
    • 处理的框架
      void backtracking()
      {
        if(终止条件)
        {
          收集结果
          return
        }
        for(集合元素)
        {
          处理节点
          递归函数
          回溯操作
        }
      }
      
    • 看到一个: 作者:show-me-the-code-2
      ①画出递归树,找到状态变量(回溯函数的参数),这一步非常重要※
      ②根据题意,确立结束条件
      ③找准选择列表(与函数参数相关),与第一步紧密关联※
      ④判断是否需要剪枝
      ⑤作出选择,递归调用,进入下一层
      ⑥撤销选择

78. 子集

class Solution {
public:
    vector<vector<int>> result{};
    vector<int> path{};
    void back_tracking(vector<int> nums,vector<int>& path,int start)
    {
        //肯定有个空集
        result.push_back(path);
        //for循环进行选择
        for(int i = start;i<nums.size();i++)
        { 
            //剪枝 去重(本题没有要求)
            //if(i>start&&nums[i] == nums[i-1]) continue;
            //选择, 加入集合
            path.push_back(nums[i]);
            //递归(向下层) 例: nums= 123 -->1 12 123 13 选择到3,递归就结束
            back_tracking(nums,path,i+1);
            //回溯 撤销选择
            path.pop_back();
        } 
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        back_tracking(nums,path,0);
        return result;
    }
};

200. 岛屿数量

class Solution {
public:
    int result = 0;
    //判断坐标是否在网格中 第r行 第c列
    bool is_in_net(vector<vector<char>>& grid,int r,int c)
    {
        return (0<=r&&r<grid.size())&&(0<=c&&c<grid[0].size());
    }

    //搜索一片陆地
    void dfs(vector<vector<char>>& grid,int r,int c)
    {
        //碰壁返回
        if(!is_in_net(grid,r,c)) return;
        //遇到 水 或者 标记过的 返回
        if(grid[r][c] == '0'||grid[r][c] == '2') return;
        //是陆地, 给个标记
        grid[r][c] = '2';
        //dfs
        dfs(grid,r+1,c);
        dfs(grid,r-1,c);
        dfs(grid,r,c+1);
        dfs(grid,r,c-1);  
    }
    int numIslands(vector<vector<char>>& grid) {
        //陆地为1, 遍历过的陆地为2, 水为0
        //遍历网格
        for(int i = 0;i<grid.size();i++)
        {
            for(int j = 0;j<grid[0].size();j++)
            {
                //找到新陆地
                if(grid[i][j] == '1')
                {
                    dfs(grid,i,j);
                    result++;
                }
            }
        }       
        return result;
    }
};

标签:200,nums,int,vector,grid,回溯,path,78
From: https://www.cnblogs.com/Long23/p/17362587.html

相关文章

  • [NOI2005] 维护数列
    总体思路其实跟用线段树维护区间最大字段和差不多,不过唯一麻烦的地方在于要算上自己。然后我们可以开一个队列来回收那些被delete的点,这样可以节省空间,特别需要注意的是release的时候,标记什么的一定记得清空。本来insert我是直接一个个merge的,这样就会导致特别慢,因此我们可以借......
  • SQLServer2005 AMD8450,3核CPU装不上sql 2005的解决办法
    中午12点开始,安装SQLServer2005,一直到晚上9点半,把网上的各个文章翻了个遍,依然没有安装上我的SQLServer2005,安装不上的症状跟网上其它人遇到的一样,可是为什么别人的就解决了,我的就不行呢```带着郁闷的心情睡觉了```夜里3点几分,起夜,想到数据库还......
  • Sql Server 2005 在建立与服务器的连接时出错。provider,error: 40
    在建立与服务器的连接时出错。在连接到SQLServer2005时,在默认的设置下SQLServer不允许进行远程连接可能会导致此失败。(provider:命名管道提供程序,error:40-无法打开到SQLServer的连接)(.NetSqlClientDataProvider) 网上找的解决办法对我的不适用下面上网......
  • 【题解】P3185 [HNOI2007]分裂游戏
    P3185[HNOI2007]分裂游戏题目描述聪聪和睿睿最近迷上了一款叫做分裂的游戏。该游戏的规则是:共有\(n\)个瓶子,标号为\(0,1,\ldots,n-1\),第\(i\)个瓶子中装有\(p_i\)颗巧克力豆,两个人轮流取豆子,每一轮每人选择\(3\)个瓶子,标号为\(i,j,k\),并要保证\(i\ltj,j......
  • ubuntu2004 下源码安装boost
    ubuntu2004下源码安装boosthttps://www.aiuai.cn/aifarm1186.htmlhttps://www.boost.org/users/history/version_1_78_0.htmlhttps://cloud.tencent.com/developer/article/1804511https://stackoverflow.com/questions/12578499/how-to-install-boost-on-ubuntuboost版本在......
  • oracle数据恢复 - dbrecover-for-oracle2009
    软件可以使用社区版,限制行数未一万行直接使用向导,默认配置执行即可需要注意选择数据文件的时候如果不知道表空间在哪个文件中就选择所有的文件最后导入的时候需要注意指定数据库服务名称sqlldruserid=user/password@servicenamecontrol=C:\Users\Administrator\Desktop\ba......
  • SQL2005_用户_'sa'_登录失败。该用户与可信_SQL_Server_连接无关联解决办法
    [code]如果安装sqlserver2005的时候,设置的身份验证模式为"windows",安装完成后,再设置为"sqlserver和windows"的身份验证模式,如果安装sqlserver2005的时候,设置的身份验证模式为"windows",安装完成后,再设置为"sqlserver和windows"的身份验证模式,......
  • [SQL Server 2008R2] 有关于判断表、字段、存过等元素是否存在相关SQL写法
    表相关普通表查询普通表是否存在可以使用object_id函数,下面的例子是查询表“t_test”是否存在之后从而进行其他的DLL操作:ifobject_id('t_test')isnotnullbegin--如果表存在这段里面写相关逻辑select1end 临时表临时表同样可以用object_id但......
  • 美国销售税合规平台TaxCloud完成2000万美元融资
    猛兽财经获悉,总部位于加州诺沃克面向电子商务企业的销售税合规平台TaxCloud近期宣布完成2000万美元融资。本轮融资由CamberPartners领投。该公司打算利用这笔资金继续为其客户提供服务,同时扩大其产品供应、营销和销售。作为投资的一部分,TaxCloud宣布任命NateGilmore为首席执行......
  • 浏览器 http 200(from cache) 和 304
    1,Last-Modified设置header("Last-Modified:".gmdate("D,dMYH:i:s",time())."GMT"); Last-Modified虽然使用了缓存,但是每次打开页面依然需要向服务器发起http请求,浏览器根据用户的$_SERVER['HTTP_IF_MODIFIED_SINCE']来判断浏览器的内容是否......