大致思路:
显然用dfs,但是我没注意到:
①dfs也要vis数组!!!而且,我其实常用的是第一次传第一个点进去,所以要在主函数里先把第一个点的vis设1!!!!
②也是本题的重点:问的是“能够到达多少个格子”,这个意思不是说一条路径上最多能有多少个格子,而是若干条路径上,只要能走到就算!所以,这里并不是在dfs前先vis=1,之后就立刻vis=0。因为:以前的思路是另一条路线可以去走其他路线走过的,但是这里的话,是全局来看的,所以走过就是走过,就不要再走,所以不用再让vis=0了!
——所以,这里也不是去更新什么最大值maxx,而是只要走到一个点,就maxx++
③很奇怪。。。牛客网oj在全局设vis数组并没有默认全部为0,我真是醉了,为了保险,还是在主函数里把数组初始化为全0吧,默不默认的真的不好说。。。。
AC代码:
class Solution {
public:
int maxx=0;
int xx[4]={-1,1,0,0};
int yy[4]={0,0,-1,1};
int vis[500][500];
int row,col;
int movingCount(int threshold, int rows, int cols)
{
if(threshold<0)
return 0;
for(int i=0;i<500;i++)
for(int j=0;j<500;j++)
vis[i][j]=0;
row=rows;
col=cols;
vis[0][0]=1;
dfs(0,0,threshold);
return maxx;
}
void dfs(int x,int y,int k) //当前在(x,y).
{
maxx++;
for(int i=0;i<4;i++) //四个方向去找可以走的
{
int xxx=x+xx[i];
int yyy=y+yy[i];
if(xxx<0 || xxx>=row || yyy<0 || yyy>=col || vis[xxx][yyy]==1 || xxx/10+xxx%10+yyy/10+yyy%10>k)
continue;
vis[xxx][yyy]=1;
dfs(xxx,yyy,k);
}
}
};