机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路分析
从(0,0)出发,走的格子不能超过迷宫的范围,坐标符合题目要求的算法,使用递归迷宫回溯算法。
#include<iostream>
using namespace std;
// 计算坐标每一位相加
int getSum(int num)
{
int sum = 0;
while (num>0)
{
sum += num % 10;
num /= 10;
}
return sum;
}
// 判断是否符合规则
bool check(const int k, const int rows, const int cols, const int row, const int col, bool* visited)
{
if (row >= 0 && row < rows&&col >= 0 && col < cols&&getSum(row) + getSum(col) <= k&&!visited[row*cols + col])
return true;
return false;
}
// 递归计算所到格子是否符合规则
int RobotMoveCount(const int k, const int rows, const int cols, const int row, const int col, bool* visited)
{
//check();
int count = 0;
if (check(k, rows, cols, row, col, visited))
{
visited[row*cols + col] = true;
return 1 + RobotMoveCount(k, rows, cols, row + 1, col, visited)
+ RobotMoveCount(k, rows, cols, row, col + 1, visited)
+ RobotMoveCount(k, rows, cols, row - 1, col, visited)
+ RobotMoveCount(k, rows, cols, row, col - 1, visited);
}
}
int RobotMove(const int k, const int rows, const int cols)
{
if (k < 0 || rows < 0 || cols < 0)
return 0;
bool * visited = new bool[rows*cols];
for (int i = 0; i < rows*cols; ++i)
visited[i] = 0;
int count = RobotMoveCount(k, rows, cols, 0, 0, visited);
delete[] visited;
return count;
}
int main()
{
cout<<RobotMove(3,5,5);
return 0;
}