第五十一题 回溯第二题
考虑由两个方向是否有路径
之前处理第一行的时候,因为没有从上面来的路径,所以一旦不符合threshold,就直接break了,但是后面行是有来自于上面的路径的时候的,所以必须要考虑进去
如图:对于第六行 假设要求各位和不能超过15,此时6+9=15,符合,6+1+0=7 后面都符合。。。。。
然后看到第七行,7+9=16 不符合了,但是7+1+0=8符合要求,按照要求看是否有路径,左边来不了,但是可以从上面下来,所以往后都是符合的
class Solution {
public:
int movingCount(int threshold, int rows, int cols) {
int ans=0;
// 记录某个位置是否可以访问到
int tempvec[rows][cols];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
tempvec[i][j]=0;
// 初始化第一行
// 第一行上面没有东西了,所以只看从左向右的路径
// 一旦超了,后面就都访问不到了
// 实例3中,访问到了0,28这一点,后面都不能访问了,虽然说可以0,30符合要求,但是因为 0,29点到不了,所以后面都不能访问
tempvec[0][0]=1;
for(int i=0;i<cols;i++)
{
// 判断ij可不可以,可以的话ans++
int temp=0;
int tempi=i;
while(tempi!=0){
temp+=tempi%10;
tempi=tempi/10;
}
if(temp<=threshold){
ans++;
tempvec[0][i]=1;
}
else
break;
}
// 然后开始向后面的所有行开始遍历
for (int i=1;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
// 判断ij可不可以,可以的话ans++
int temp=0;
int tempi=i;
int tempj=j;
// ij按位求和
while(tempi!=0)
{
temp+=tempi%10;
tempi=tempi/10;
}
while(tempj!=0){
temp+=tempj%10;
tempj=tempj/10;
}
// 点可以访问的两个要求:1.点的坐标和符合要求;2.点能有路径到
// 1就不细说了
// 主要看2:之前说了,实例三中后面是不能访问的,但是考虑到后面的行,就要考虑是不是可以从上面下来!
// 不方便说,看后面的图
// 如果说 符合要求 并且 (左边有路 或者 上面有路)那么结果正确
if(temp<=threshold && ( tempvec[i-1][j]==1 || tempvec[i][j-1]==1) )
{
ans++;
tempvec[i][j]=1;
}
}
}
// 可以访问到的点的二维数组输出
/*
for (int i=1;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
cout<<tempvec[i][j]<<" ";
}
cout<<endl;
}*/
return ans;
}
};
public:
int movingCount(int threshold, int rows, int cols) {
int ans=0;
// 记录某个位置是否可以访问到
int tempvec[rows][cols];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
tempvec[i][j]=0;
// 初始化第一行
// 第一行上面没有东西了,所以只看从左向右的路径
// 一旦超了,后面就都访问不到了
// 实例3中,访问到了0,28这一点,后面都不能访问了,虽然说可以0,30符合要求,但是因为 0,29点到不了,所以后面都不能访问
tempvec[0][0]=1;
for(int i=0;i<cols;i++)
{
// 判断ij可不可以,可以的话ans++
int temp=0;
int tempi=i;
while(tempi!=0){
temp+=tempi%10;
tempi=tempi/10;
}
if(temp<=threshold){
ans++;
tempvec[0][i]=1;
}
else
break;
}
// 然后开始向后面的所有行开始遍历
for (int i=1;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
// 判断ij可不可以,可以的话ans++
int temp=0;
int tempi=i;
int tempj=j;
// ij按位求和
while(tempi!=0)
{
temp+=tempi%10;
tempi=tempi/10;
}
while(tempj!=0){
temp+=tempj%10;
tempj=tempj/10;
}
// 点可以访问的两个要求:1.点的坐标和符合要求;2.点能有路径到
// 1就不细说了
// 主要看2:之前说了,实例三中后面是不能访问的,但是考虑到后面的行,就要考虑是不是可以从上面下来!
// 不方便说,看后面的图
// 如果说 符合要求 并且 (左边有路 或者 上面有路)那么结果正确
if(temp<=threshold && ( tempvec[i-1][j]==1 || tempvec[i][j-1]==1) )
{
ans++;
tempvec[i][j]=1;
}
}
}
// 可以访问到的点的二维数组输出
/*
for (int i=1;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
cout<<tempvec[i][j]<<" ";
}
cout<<endl;
}*/
return ans;
}
};