劍指 Offer 13 - 機器人的運動範圍
阿新 • • 發佈:2020-09-21
1 題目
https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
2 題意
地上有一個m行n列的方格,從座標 [0,0]
到座標 [m-1,n-1]
。一個機器人從座標 [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行座標和列座標的數位之和大於k的格子。例如,當k為18時,機器人能夠進入方格 [35, 37]
,因為3+5+3+7=18
。但它不能進入方格 [35, 38]
,因為3+5+3+8=19
。請問該機器人能夠到達多少個格子?
示例 1:
輸入:m = 2, n = 3, k = 1 輸出:3
示例 2:
輸入:m = 3, n = 1, k = 0
輸出:1
提示:
1 <= n,m <= 100
0 <= k<= 20
3 思路
author's blog == http://www.cnblogs.com/toulanboy/
出發點:本題需要知道機器人從起點出發,能到達的格子數,可以用搜索演算法解決。
具體搜尋思路:機器人每次的移動方向都是上下左右四個方向,我們只需判斷是否能走到這4個方向的格子,如果能,則進一步迴圈(或遞迴)這個過程。
實現方式:深度優先搜尋或廣度優先搜尋皆可。本題採用廣度優先搜尋,相對的優點是沒有遞迴過程,理論上能減少時間。
4 程式碼
//author's blog == http://www.cnblogs.com/toulanboy/ class Solution { public: int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; bool visit[110][110]; bool judge(int x, int y, int m, int n, int k){ if(x >= 0 && x < m && y >=0 && y < n && visit[x][y] == false){ //拆分行座標、列座標 int sum = 0; while(x){ sum += x%10; x /= 10; } while(y){ sum += y%10; y /= 10; } if(sum > k){ return false; } else{ return true; } } return false; } int movingCount(int m, int n, int k) { int ans = 0; memset(visit, 0, sizeof(visit)); queue<pair<int, int> >q; q.push(make_pair(0, 0));//將起點進隊 visit[0][0] = true; ans++;//起點也能到達,ans++。 while(!q.empty()){//開始逐層擴散 int x = q.front().first; int y = q.front().second; q.pop(); for(int i=0; i<4; ++i){//四個方向 int new_x = x + dir[i][0]; int new_y = y + dir[i][1]; if(judge(new_x, new_y, m, n, k)){//合法性判斷、能否到達判斷 ans++; q.push(make_pair(new_x, new_y)); visit[new_x][new_y] = true; } } } return ans; } };