剑指offer面试题67:机器人的运动范围

这道题又是一道回溯算法的问题。关于回溯算法,并不是特别擅长,这道题真的是不错的练手题目。可以通过这道题更加深刻的理解下回溯算法是怎么回事。

这道题一开始有几个疑惑的地方,就是回溯的时候怎么处理有的点进行了多次递归的问题。答案之中用了一个动态数组就轻松解决了这个问题。

这道题可以用四个函数来解决这个问题。

看完书上的内容,代码成功的默写出来了。代码如下:

//函数入口。

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;

}

现在已经基本上理解了这道题的意思了。感觉还不错。不过,有一点要注意,一定要找时间复习一下。很容易忘记的。

你可能感兴趣的:(面试题)