机器人的运动范围

来源:互联网 发布:淘宝钻石展位是什么 编辑:程序博客网 时间:2024/05/16 00:46

题目:

地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18。但它不能进入方格(35,38),因为3+5+3+8=19。请问机器人能够到达多少格子?

分析:

回溯算法经典入门例子。

/* 机器人运动范围 */#include <iostream>using namespace std;int moveCountCore(int, int, int, int, int, bool*);bool check(int, int, int, int, int, bool*);int getDigit(int);int moveCount(int k, int m, int n){    int count = 0;    bool *visited = new bool[m*n];    for (int i = 0; i < m*n; i++)        visited[i] = false;    if (k <= 0 || m <= 0 || n <= 0){        return count;    }    count = moveCountCore(k, m, n, 0, 0, visited);    delete[] visited;    return count;}/*  */int moveCountCore(int k, int m, int n, int i, int j, bool* visited){    int count = 0;    if (i < 0 || i >= m || j < 0 || j >= n || !check(k, m, n, i, j, visited)){        return count;    }    visited[i*n + j] = true; //标记节点被访问    cout << i << "," << j << endl;    count = 1 + moveCountCore(k, m, n, i, j + 1, visited) + //往右走        moveCountCore(k, m, n, i, j - 1, visited) + //往左走        moveCountCore(k, m, n, i + 1, j, visited) + //往上走        moveCountCore(k, m, n, i - 1, j, visited);  //往下走    return count;}/* 访问格子的合法性检查 */bool check(int k, int m, int n, int i, int j, bool* visited){    if (i >= 0 && i < m && j >= 0 && j < n &&        !visited[i*n + j] && getDigit(i)+getDigit(j) <= k){        return true;    }    return false;}/* 数位之和 */int getDigit(int number){    int res = 0;    while (number){        res += number % 10;        number /= 10;    }    return res;}int main(){    cout << moveCount(5, 3, 10) << endl;}
0 0
原创粉丝点击