国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑

這篇具有很好參考價值的文章主要介紹了劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑,矩陣,深度優(yōu)先,線性代數(shù)

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];//標(biāo)記當(dāng)前位置有沒有被訪問過
        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)//如果到了一行的最后面就調(diào)轉(zhuǎn)到下一行 大前提是找不到word[index]相等
                 {
                     cout<<"最末尾的 "<<board[i][j]<<endl;
                     i++;
                     j=0;
                 }
                 else j++;
                }
        }  
        return 0;
    }
};

//寫的有點問題,暫時想不到怎么改,先放著,通過用例71/83 卡住的是abcd 但是改了又有問題
無語 看了 答案 都寫不對 在類成員里面定義了row和col 就不要重復(fù)定義了 不然不知道為什么就開始發(fā)瘋

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

劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑,矩陣,深度優(yōu)先,線性代數(shù)
先貼出蠢貨寫出來的東西 審題也審不明白 機器人只能上下左右走 不能一行一行遍歷 菜鳥總是這樣 自己把自己搞破防
通過用列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】雖然數(shù)位之和等于1,但是無法通過【9,0】或者其他走過去,假設(shè)k=1的話,也就是他媽的他有障礙物啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
aaaa繼續(xù)做就是要判斷邊界條件啊啊啊啊啊啊啊啊啊啊啊啊就是判斷他是否能進入4個相鄰的格子
首先0,0必定可以嗷,check[0,0]置為1。0,0能走到0,1和1,0,那對于0,1和1,0兩個點來說,就是判斷他們的上面i-1和左邊j-1是否可以走,如果可以那就可以從左邊和上面分別走過來,能走到當(dāng)前這個點就置為1,然后左邊和上面能走的點都走了之后,還有兩個方向沒有判斷 ,再來判斷能不能從右邊(i+1)走到左邊,下面(i+1)走到上面,如果能走到當(dāng)前點,就置為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進行內(nèi)存清零,可以將一塊內(nèi)存設(shè)置為指定的值
        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;
   }
};

劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑,矩陣,深度優(yōu)先,線性代數(shù)

和上題目類似,屬于典型的搜索&回溯算法
先了解一下BFS模板
不需要當(dāng)前遍歷到哪一層,BFS模板

while queue 不空
   cur=queue.front();
   queue.pop();
   for 結(jié)點 in cur的所有相鄰節(jié)點
     if 該節(jié)點有效且沒被訪問過:
        queue.push(該結(jié)點)

需要確定遍歷到哪一層,比如之前寫過一題打印二叉鏈表

level=0
while queue不空:
  size=queue.size()
  while(size--){
  cur=queue.pop();
  for 結(jié)點 in cur的所有相鄰結(jié)點:
    if 該節(jié)點有效且未被訪問過:
       queue.push(該節(jié)點)
       }
  level++;

直接使用模板

算了dfs

class Solution {
public:
    int sum(int x){//計算數(shù)位和
        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列
//不能進入行坐標(biāo)和列坐標(biāo)的"數(shù)位"之和大于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解法就見鬼去吧 不想寫隊列啊啊啊啊
劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑,矩陣,深度優(yōu)先,線性代數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-609542.html

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

到了這里,關(guān)于劍指offer12 矩陣中的路徑 13 機器人的運動范圍 34.二叉樹中和為某一值得路徑的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 劍指 Offer 12. 矩陣中的路徑(回溯 DFS)

    劍指 Offer 12. 矩陣中的路徑(回溯 DFS)

    給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許被重復(fù)使用。

    2024年02月12日
    瀏覽(18)
  • leetcode(力扣) 劍指 Offer 12. 矩陣中的路徑(回溯 DFS)

    leetcode(力扣) 劍指 Offer 12. 矩陣中的路徑(回溯 DFS)

    給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許被重復(fù)使用。

    2024年02月14日
    瀏覽(20)
  • 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)

    用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)

    給定一個?m x n 二維字符網(wǎng)格?board 和一個字符串單詞?word 。如果?word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許被重復(fù)使

    2023年04月10日
    瀏覽(18)
  • (搜索) 劍指 Offer 12. 矩陣中的路徑 ——【Leetcode每日一題】

    (搜索) 劍指 Offer 12. 矩陣中的路徑 ——【Leetcode每日一題】

    難度:中等 給定一個 m * n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許

    2024年02月12日
    瀏覽(28)
  • 劍指offer(C++)-JZ12:矩陣中的路徑(算法-回溯)

    劍指offer(C++)-JZ12:矩陣中的路徑(算法-回溯)

    作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處 題目描述: 請設(shè)計一個函數(shù),用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以

    2024年02月11日
    瀏覽(22)
  • 劍指 Offer 12. 矩陣中的路徑 / LeetCode 79. 單詞搜索(深度優(yōu)先搜索)

    劍指 Offer 12. 矩陣中的路徑 / LeetCode 79. 單詞搜索(深度優(yōu)先搜索)

    鏈接:劍指 Offer 12. 矩陣中的路徑;LeetCode 79. 單詞搜索 難度:中等 給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相

    2024年02月02日
    瀏覽(28)
  • 劍指 Offer !!13. 機器人的運動范圍

    劍指 Offer 13. 機器人的運動范圍 地上有一個m行n列的方格,從坐標(biāo) [0,0] 到坐標(biāo) [m-1,n-1] 。一個機器人從坐標(biāo) [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。例如,當(dāng)k為18時,機器人能

    2024年02月12日
    瀏覽(18)
  • 劍指 Offer 13. 機器人的運動范圍

    地上有一個m行n列的方格,從坐標(biāo)? [0,0] ?到坐標(biāo)? [m-1,n-1] ?。一個機器人從坐標(biāo)? [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。例如,當(dāng)k為18時,機器人能夠進入方格 [35, 37] ,因為

    2024年02月14日
    瀏覽(19)
  • 劍指 Offer !!13. 機器人的運動范圍(回溯算法)

    劍指 Offer 13. 機器人的運動范圍 地上有一個m行n列的方格,從坐標(biāo) [0,0] 到坐標(biāo) [m-1,n-1] 。一個機器人從坐標(biāo) [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。例如,當(dāng)k為18時,機器人能

    2024年02月11日
    瀏覽(19)
  • 劍指Offer13.機器人的運動范圍 C++

    地上有一個m行n列的方格,從坐標(biāo) [0,0] 到坐標(biāo) [m-1,n-1] 。一個機器人從坐標(biāo) [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。例如,當(dāng)k為18時,機器人能夠進入方格 [35, 37] ,因為3+5+3+

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包