欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

专题十二_洪水灌溉算法_算法专题详细摘要-7.壁橱组织(中型)

最编程 2024-10-19 14:36:22
...
题目意思比较简单,但是还是有点难读懂,意思就是给定义一个k值,然后要你从[0,0]开始进行遍历,可以上下左右进行遍历,判断当前所在位置的下标的每一位和是否大于k,如果大于,那么就要进行回退了,否则,就可以一直遍历下去,然后统计满足条件的格子。

解析:

题目还真的挺简单的,就是只需要从[0,0]开始只进行一次dfs即可,也不用恢复现场,那么

设置全局变量:

ret,n,m,k

bool visit[][];

int dx[],dy[]

然后dfs(0,0)开始进行遍历,只要进入这个函数,就要设置visit为true,让ret++,说明此时已经满足了这个条件。

那么就是固定的深度优先遍历算法:

 if(x>=0&&x<m&&y>=0&&y<n&&visit[x][y]==false&&check(x,y)<k)

唯一要注意的判断条件就是check()函数,里面要求出x,y两个数字的所有位数之和。判断是小于k的才能进入下一层。 

class Solution {
public:
    int ret=0;
    int n,m,k;
    int dx[4]={0,-1,0,1};
    int dy[4]={-1,0,1,0};
    bool visit[110][110];
    int wardrobeFinishing(int _m, int _n, int _k) {
        m=_m,n=_n,k=_k;
        dfs(0,0);
        return ret;
    }

    void dfs(int i,int j)
    {
        visit[i][j]=true;
        ret++;

        for(int k=0;k<4;k++)
        {
            int x=dx[k]+i;
            int y=dy[k]+j;
            if(x>=0&&x<m&&y>=0&&y<n&&visit[x][y]==false&&check(x,y)<k)
            {
                dfs(x,y);
            }
        }
    }

    int check(int i,int j)
    {
        int sum=0;
        while(i)
        {
            sum+=i%10;
            i/=10;
        }
        while(j)
        {
            sum+=j%10;
            j/=10;
        }
        return sum;
    }
};

总结:

题目并不难,只要能读懂意思,我相信肯定就能写出来。

总结到这里~确实发现了自己的成长,虽然不是说一帆风顺,但总归是有结果发生,对我的收获很大,希望对你也是~