这道题又是一道回溯算法的问题。关于回溯算法,并不是特别擅长,这道题真的是不错的练手题目。可以通过这道题更加深刻的理解下回溯算法是怎么回事。
这道题一开始有几个疑惑的地方,就是回溯的时候怎么处理有的点进行了多次递归的问题。答案之中用了一个动态数组就轻松解决了这个问题。
这道题可以用四个函数来解决这个问题。
看完书上的内容,代码成功的默写出来了。代码如下:
//函数入口。 int MovingCount(int threshhold, int rows, int columns) { bool* HasVisited = new bool[rows*columns]; for (int i = 0; i < rows*columns; ++i) { HasVisited[i] = false; } int count = MovingCount(threshhold, rows, columns, 0, 0, HasVisited); delete[] HasVisited; return count; } //进行递归算法的核心代码 int MovingCount(int threshhold, int rows, int columns, int row, int column, bool* HasVisited) { int count = 0; if (check(threshhold, rows, columns, row, column, HasVisited)) { HasVisited[row*columns + column] = true; count = 1 + MovingCount(threshhold, rows, columns, row - 1, column, HasVisited) + MovingCount(threshhold, rows, columns, row, column - 1, HasVisited) + MovingCount(threshhold, rows, columns, row + 1, column, HasVisited) + MovingCount(threshhold, rows, columns, row, column + 1, HasVisited); } return count; } //判断这个点是否合适 bool check(int threshhold, int rows, int columns, int row, int column, bool* HasVisited) { if (row < rows&&column < columns&&HasVisited[row*columns + column] == false && GetDigitNum(row) + GetDigitNum(column) <= threshhold) return true; else return false; } int GetDigitNum(int number) { int sum = 0; while (number > 0) { sum += number % 10; number /= 10; } return sum; }
现在已经基本上理解了这道题的意思了。感觉还不错。不过,有一点要注意,一定要找时间复习一下。很容易忘记的。