代码如下:
class Solution {
bool check(int x, int y, int k){ //比较当前行列号(i,j)是否满足限制条件
int sum = 0;
while(x || y){
sum += x%10+y%10;
x /= 10; y /= 10;
}
return sum<=k;
}
void helper(int x, int y, int m, int n, int k, int &count, vector<bool> &visit){
int idx = x*n+y; //二维转化为一维
if(x>=m || x<0 || y>=n || y<0 || !check(x,y,k)|| visit[idx]) return;
count++; visit[idx]=1; //标记访问
//上下左右搜索
helper(x+1, y, m, n, k, count, visit);
helper(x-1, y, m, n, k, count, visit);
helper(x, y+1, m, n, k, count, visit);
helper(x, y-1, m, n, k, count, visit);
}
public:
int movingCount(int m, int n, int k) {
int count = 0;
vector<bool> visit(m*n, 0);
helper(0, 0, m, n, k, count, visit);
return count;
}
};
解:绳长为2和3的时候,分割后的长度不如自身长度长,所以把绳长为2和3的情况单独拿出来讨论。
class Solution {
public:
int cuttingRope(int n) {
if (n == 2)
return 1;
if (n == 3)
return 2;
int time3 = n / 3; //n >=5 时应多剪长度为3的绳子
if (n - 3 * time3 == 1)
time3 --;
int time2 = (n - 3 * time3) / 2;
return pow(2, time2) * pow(3, time3);
}
};