专题十二_洪水灌溉算法_算法专题详细摘要-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;
}
};
总结:
题目并不难,只要能读懂意思,我相信肯定就能写出来。
总结到这里~确实发现了自己的成长,虽然不是说一帆风顺,但总归是有结果发生,对我的收获很大,希望对你也是~