数据结构学习 jz13衣橱整理

关键词:搜索算法 dfs bfs 回溯

题目:

各数位之和:

求法代码:

    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }

总的思路:

这道题是求可以到达的格子数,想到可以用搜索算法来做,可以用dfs或者bfs。

可以去看这位大佬的分析。我基本是按照他的思路写的,但是把代码写的好看了一些。求各数位之和我用了封装好的sums函数,看起来舒服一些。

我一开始用传统的dfs做不出来也不知道为什么。

解法一:dfs 回溯

思路:

复杂度计算:

时间复杂度O(nm)

空间复杂度O(nm)

代码:

class Solution {
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        vector<vector<int>> visited(m,vector<int>(n));
        return dfs(0,0,0,0,visited,m,n,cnt);
    }
    int dfs(int i,int j,int si,int sj,vector<vector<int>>& visited,int m,int n,int cnt)
    {
        if(si+sj>cnt||i>=m||j>=n||visited[i][j]) return 0;//中止条件
        visited[i][j]=1;//标记
        return 1+dfs(i+1,j,sums(i+1),sj,visited,m,n,cnt)+dfs(i,j+1,si,sums(j+1),visited,m,n,cnt);
    }
    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }
};

解法二:bfs

思路:

 

复杂度计算:

时间复杂度O(nm)

空间复杂度O(nm)

代码:

class Solution {
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        vector<vector<int>> visited(m,vector<int>(n));
        int res=0;
        queue<vector<int>> que;
        que.push({0,0,0,0});
        while(!que.empty())
        {
            vector<int> x=que.front();
            que.pop();
            int i=x[0],j=x[1],si=x[2],sj=x[3];
            if(i>=m||j>=n||si+sj>cnt||visited[i][j])
                continue;
            visited[i][j]=1;
            res++;
            que.push({i+1,j,sums(i+1),sj});
            que.push({i,j+1,si,sums(j+1)});
            
        }
        return res;
    }

    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }
};

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值