机器人的运动范围
来源:互联网 发布:淘宝钻石展位是什么 编辑:程序博客网 时间: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
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 线性代数导论14——正交向量与子空间
- 广州大学第九届ACM B--再来一道
- poj1330Nearest Common Ancestors以及讲解倍增法求lca
- IOS中RSA的加密解密(转载)
- Code Commit Flow
- 机器人的运动范围
- 线性代数导论15——子空间投影
- 三大WEB服务器对比分析(apache ,lighttpd,nginx)
- GPS精密星历文件下载地址
- hdu1536 1848
- 线性代数导论16——投影矩阵和最小二乘
- Oracle中Instr用法
- sdut2880---Devour Magic(山东省第五届ACM题)
- 性能调优攻略