这中类型的题主要是考察 图搜索,一般都是用类似 dfs,bfs 的尝试算法,其实某种程度上算是穷举法,这个比直接暴力可能要节约一点时间,但是dfs的递归调用栈内存也是不好扛的。,,虽然一开始我是想用 bfs 的,但是发现还要用个数据结构来存每一层的点的坐标。所以写成 dfs,,,,可能有点晕,,,把 bfs 改成 dfs 就好理解了。https://blog.csdn.net/yinchaoji_/article/details/51264837 贴一个4年前的我的一篇博文(chaode)....,现在来理解比当时理解肯定要深刻些,,,
public int movingCount(int threshold, int rows, int cols) { if(rows < 0 || cols<0){ return 0; } int [] book=new int [rows*cols]; //用一个一维数组做逻辑索引 int x=0; int y=0; int res=0; bfs(book,x,y,rows,cols,threshold); for(int i=0;i<book.length;i++){ if(book[i]==1){ res+=1; } } return res; } public void bfs(int [] book,int x ,int y ,int rows,int cols,int k){ //核心 while(x>=0 && x<rows && y<cols && y>=0){ int mark=x*cols+y; //获得逻辑索引位置 int limit=getLimit(x,y);//获得限制的判断 if(book[mark]==0 && limit<=k){ //此点满足条件的才可以进行下一个点的着***ook[mark]=1; bfs(book,x+1,y,rows,cols,k); bfs(book,x-1,y,rows,cols,k); bfs(book,x,y+1,rows,cols,k); bfs(book,x,y-1,rows,cols,k); }else { // 不满足的,打回,,因为这个点都到不了,这个点的下一个点肯定也是到不了的 return; } } return ; } public int getLimit(int x ,int y ){ return getNumsSum(x)+getNumsSum(y); } public int getNumsSum(int x){ //求数位和 int sum=0; int y =0; while(x%10!=0){ y=x%10; x=x/10; sum+=y; } return sum; }