标签:10 rows offer int 机器人 cols DFS threshold
描述
地上有一个rows行和cols列的方格。坐标从 [0,0] 到 [rows-1,cols-1]。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于threshold的格子。 例如,当threshold为18时,机器人能够进入方格[35,37],因为3+5+3+7 = 18。但是,它不能进入方格[35,38],因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? 求解思路:- 首先确定DFS的思路,
- 一个格子有上下左右四个方向,但其实我们只需要关注右下两个方向就行
代码:
1 class Solution { 2 private: 3 int count=0; 4 public: 5 int movingCount(int threshold, int rows, int cols) { 6 if(threshold<=0){ 7 return 1; 8 } 9 // 能用向量尽量用向量,初始化都简单很多 10 // bool** flag=new bool*[rows]; 11 // for(int i=0;i<rows;++i){ 12 // flag[i]=new bool[cols]; 13 // for(int j=0;j<cols;++j){ 14 // flag[i][j]=false; 15 // } 16 // } 17 vector<vector<bool>> flag(rows,vector<bool>(cols,false)); 18 DFS(threshold,flag,0,0,rows,cols); 19 return count; 20 } 21 22 // count已经是成员变量了,不需要返回 23 // 递归中改变参数的值:静态变量、成员变量、引用 24 void DFS(int ths,vector<vector<bool>>& flag, int x,int y,int rs,int cs){ 25 if(getSum(x,y)>ths || rs<=x || cs<=y || flag[x][y]){ 26 return; 27 } 28 flag[x][y]=true; 29 count+=1; 30 DFS(ths,flag,x+1,y,rs,cs); // 只需关注向右递归 31 DFS(ths,flag,x,y+1,rs,cs); // 只需关注向下递归 32 } 33 34 // 计算两个数字的位数和 35 int getSum(int nr,int nc){ 36 int res=0; 37 while(nc>0){ 38 res+=nc%10;nc/=10; 39 } 40 while(nr>0){ 41 res+=nr%10;nr/=10; 42 } 43 return res; 44 } 45 };
心得:
- 递归中改变参数的三种方式:成员变量、静态变量、引用
- 尽量用向量而非数组
- 尽量让代码更简介(如计算两个数字的位数之和,明显有冗余代码),更有逻辑性。
标签:10,rows,offer,int,机器人,cols,DFS,threshold 来源: https://www.cnblogs.com/zgll/p/15117224.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。