劍指offer-13-機器人的運動範圍
阿新 • • 發佈:2020-08-03
思路:
寬度優先搜尋
確定起點座標後,向四周進行搜尋
在節點擴充套件時需要判斷是否重複,是否出邊界,橫縱座標數字之和小於K
程式碼:
class Solution { public: //座標進行計算 int single_sum(int x) { int s=0; while(x) s+=x%10,x/=10; return s; } int get_sum(pair<int,int>p) { return single_sum(p.first) + single_sum(p.second); }int movingCount(int threshold, int rows, int cols) { int res=0; //判斷為空條件 if(!rows || !cols) return 0; //判斷矩陣中搜索重複問題 vector<vector<bool>> st(rows,vector<bool>(cols)); //將矩陣的座標看成是一個點放入佇列中 queue<pair<int,int>> q; q.push({0,0}); int dx[4]={-1,0,1,0}, dy[4]={0,-1,0,1}; while(q.size()) { auto t=q.front(); q.pop(); //判斷邊界條件 if(get_sum(t)> threshold ||st[t.first][t.second]) continue; res ++; //對走過的點進行標記 st[t.first][t.second] = true; //機器人移動 for(int i=0;i<4;i++) { int x=t.first + dx[i], y=t.second+dy[i]; //判斷 if(x>=0 && x<rows && y>=0 && y<cols) q.push({x,y}) } } return res; } };