zoukankan      html  css  js  c++  java
  • Leetcode---剑指Offer题12 13---回溯法




    剑指Offer-面试题12---回溯法

    1、题目1 矩阵中的路径

    https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/submissions/

    回溯法

    class Solution {
    public:
        bool searchPath(const vector<vector<char>>& board,int i,int j,const string& word,int index,int height,int width,int len,vector<bool> searched)
        {
            if(index >= len)
                return true;
            if(i>=height || j>=width || i<0 || j<0 || board[i][j]!=word[index] || searched[j+i*width])
            {
                return false;
            }
    
            bool isCanGo = false;
    
            searched[j+i*width] = true;
            index++;
            isCanGo = searchPath(board,i+1,j,word,index,height,width,len,searched)||
                    searchPath(board,i-1,j,word,index,height,width,len,searched)||
                    searchPath(board,i,j+1,word,index,height,width,len,searched)||
                    searchPath(board,i,j-1,word,index,height,width,len,searched);
            //不能成功的话,回溯寻找新的路径
            if(!isCanGo)
            {
                index -- ;
                searched[j+i*width] = false;
            }
    
            return isCanGo;
        }
    
    
        bool exist(vector<vector<char>>& board, string word)
        {
            if(board.size()==0 || word==" ")
                return false;
    
            int len = word.size();
            int height = board.size();
            int width = board[0].size();
    
            vector<bool> searched(height*width,false);
    
            for(int i=0; i<height; i++)
            {
                for(int j=0; j<width; j++)
                {
                    if(searchPath(board,i,j,word,0,height,width,len,searched))
                        return true;
                }
            }
    
            return false;
        }
    
    };
    
    

    2、题目2 机器人的运动范围

    https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/

    回溯法

    class Solution {
    public:
        int movingCount(int m, int n, int k)
        {
            if(m <= 0 || n<=0 || k < 0)
                return 0;
    
            vector<bool> hasGo(m*n,false);
    
            int result = searchPath(0,0,m,n,k,hasGo);
    
            return result;
        }
    
        int CalculateNumWei(int num1,int num2)
        {
            int result = 0;
            while(num1 != 0){
                result += num1%10;
                num1/=10;
            }
            while(num2 != 0){
                result += num2%10;
                num2/=10;
            }
    
            return result;
        }
    
        int searchPath(int i,int j,int m, int n, int k,vector<bool>& hasGo)
        {
            int count = 0;
    
            if(i>=m || j>=n || i<0 || j<0 || CalculateNumWei(i,j)>k ||hasGo[j+i*n])
                return count;
    
            hasGo[j+i*n] = true;
    
            count = 1 + searchPath(i+1,j,m,n,k,hasGo)+
                    searchPath(i-1,j,m,n,k,hasGo)+
                    searchPath(i,j+1,m,n,k,hasGo)+
                    searchPath(i,j-1,m,n,k,hasGo);
    
            return count;
        }
    };
    
  • 相关阅读:
    鼠标移上与移出事件
    最小高度 最大高度
    鼠标移上改变光标
    设置圆角
    iframe 子窗口获取父窗口元素 父窗口获取子窗口元素
    parent
    禁用滚动条
    mysql--user表
    mysql客户端连不上数据库
    linux下安装MySQL
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/12444409.html
Copyright © 2011-2022 走看看