题目:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
深度优先,广度优先都可以
//深度优先
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if (0 == rows && 0 == cols)
return 0;
int Count = 0;
//false未访问过, true访问过,不管是否满足条件
vector<vector<bool> >flag(rows, vector<bool> (cols, false));
DFS(rows, cols, 0, 0, flag, threshold, Count);
return Count;
}
void DFS(int rows, int cols, int cur_rows, int cur_cols, vector<vector<bool> > &flag, int threshold, int &Count)
{
//这里不管是否满足条件,都置为true
flag[cur_rows][cur_cols] = true;
if(!IfSmallThanThreshold(cur_rows, cur_cols, threshold))
return;
++Count;
if (cur_rows < rows-1 && !flag[cur_rows + 1][cur_cols])
{
DFS(rows, cols, cur_rows+1, cur_cols, flag, threshold, Count);
}
if (cur_rows > 0 && !flag[cur_rows - 1][cur_cols])
{
DFS(rows, cols, cur_rows-1, cur_cols, flag, threshold, Count);
}
if (cur_cols > 0 && !flag[cur_rows][cur_cols-1])
{
DFS(rows, cols, cur_rows, cur_cols-1, flag, threshold, Count);
}
if (cur_cols < cols-1 && !flag[cur_rows][cur_cols+1])
{
DFS(rows, cols, cur_rows, cur_cols+1, flag, threshold, Count);
}
}
bool IfSmallThanThreshold(int cur_rows, int cur_cols, int threshold)
{
int sum = 0;
while(cur_rows != 0)
{
sum += cur_rows%10;
cur_rows /= 10;
}
while(cur_cols != 0)
{
sum += cur_cols%10;
cur_cols /= 10;
}
return sum <= threshold;
}
};
//广度优先
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if (0 == rows && 0 == cols)
return 0;
if (!IfSmallThanThreshold(0,0,threshold))
return 0;
//false未访问过, true访问过,不管是否满足条件
vector<vector<bool> >flag(rows, vector<bool> (cols, false));
int Count = 0, cur_rows = 0, cur_cols = 0;
queue<pair<int, int>> que;
que.push(pair<int, int>(0,0));
flag[0][0] = true;
while(!que.empty())
{
pair<int, int> tmp = que.front();
que.pop();
cur_rows = tmp.first;
cur_cols = tmp.second;
if(!IfSmallThanThreshold(cur_rows, cur_cols, threshold))
continue;
++Count;
if (cur_rows < rows-1 && !flag[cur_rows + 1][cur_cols])
{
//一定要在这里面置为true,不能在上面,不然会有重复
que.push(pair<int,int> (cur_rows + 1, cur_cols));
flag[cur_rows + 1][cur_cols] = true;
}
if (cur_rows > 0 && !flag[cur_rows - 1][cur_cols])
{
que.push(pair<int,int> (cur_rows - 1, cur_cols));
flag[cur_rows - 1][cur_cols] = true;
}
if (cur_cols > 0 && !flag[cur_rows][cur_cols - 1])
{
que.push(pair<int,int> (cur_rows, cur_cols - 1));
flag[cur_rows][cur_cols - 1] = true;
}
if (cur_cols < cols-1 && !flag[cur_rows][cur_cols + 1])
{
que.push(pair<int,int> (cur_rows, cur_cols + 1));
flag[cur_rows][cur_cols + 1] = true;
}
}
return Count;
}
bool IfSmallThanThreshold(int cur_rows, int cur_cols, int threshold)
{
int sum = 0;
while(cur_rows != 0)
{
sum += cur_rows%10;
cur_rows /= 10;
}
while(cur_cols != 0)
{
sum += cur_cols%10;
cur_cols /= 10;
}
return sum <= threshold;
}
};