首页 > 代码库 > 剑指offer-机器人的运动范围
剑指offer-机器人的运动范围
剑指offer--机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
题解:
使用BFS,从[0, 0] 开始bfs。
class Solution { public: const int dx[4] = {0, 0, -1, 1}; const int dy[4] = {1, -1, 0, 0}; bool check(int x, int y, int th){ int cnt = 0; while(x){ cnt += x%10; x = x/10; } while(y){ cnt += y%10; y = y/10; } return cnt <= th; } int movingCount(int threshold, int rows, int cols) { vector<vector<int> > vis(rows, vector<int>(cols, 0)); queue<pair<int, int>> sq; sq.push(make_pair(0, 0)); vis[0][0] = 1; int cur_x, cur_y, tmp_x, tmp_y, ans=0; if(threshold >= 0){ ans = 1; } while(!sq.empty()){ cur_x = sq.front().first; cur_y = sq.front().second; sq.pop(); for(int i=0; i<4; ++i){ tmp_x = cur_x + dx[i]; tmp_y = cur_y + dy[i]; if( tmp_x>=0 && tmp_x<rows && tmp_y>=0 && tmp_y<cols && vis[tmp_x][tmp_y]==0 && check(tmp_x, tmp_y, threshold) ){ ans++; vis[tmp_x][tmp_y] = 1; sq.push(make_pair(tmp_x, tmp_y)); } } } return ans; } };
剑指offer-机器人的运动范围
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。