易于理解,逻辑简单清晰,无复杂操作

机器人的运动范围

http://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8

算法思路

  1. 机器人从初始点各自往(上、下、左、右)这四个方向之一个方向移动访问可访问的点(入栈保存)记录个数,直至无法访问(记录访问的二维数组(1/0)和是否可通的二维数组(true/false)[根据threshold])
  2. 从一个的初始点(某一可访问的点)开始
  3. 回到第一步,直到栈中没有初始点

准备

  1. boolean [][]map,用于判断该点是否可被访问,即是否满足threshold
  2. int [][]memory,用于判断该点是否已经被访问,以及记录访问点
  3. Stack<Index> stack,用于记录可达到的点,用于作为新的起始点
  4. int count=0; 用于记录可移动范围
  5. class Index;Index类用于保存初始点
    package 剑指offer.机器人活动的最大范围;
    
    import java.util.Stack;
    
    public class Solution {
    	static class Index{
    		int x;
    		int y;
    		public Index(int x,int y) {
    			this.x=x;
    			this.y=y;
    		}
    	}
    	public static int movingCount(int threshold, int rows, int cols)
        {
    		boolean [][]map=new boolean[rows][cols];
    		int [][]memory=new int[rows][cols];//记录是否已经走过
    		Stack<Index> stack=new Stack<Index>();
            int count=0;
            Index index;
            int x,y;
            for(int i=0;i<rows;i++){
                for(int j=0;j<cols;j++){
                    map[i][j]=canMov(i,j,threshold);
                }
            }
            stack.push(new Index(0,0));
            count++;
            memory[0][0]=1;
            while(!stack.isEmpty()) {
            	index=stack.pop();
            	x=index.x;
            	y=index.y;
            	
            	//向右走
            	while(y+1<cols&&map[x][y+1]) {
            		y++;
            		if(memory[x][y]!=1) {
            			memory[x][y]=1;
            			count++;
            			stack.push(new Index(x,y));
            		}
            	}
            	x=index.x;
            	y=index.y;
            	//向左走
            	while(y-1>=0&&map[x][y-1]) {
            		y--;
            		if(memory[x][y]!=1) {
            			memory[x][y]=1;
            			count++;
            			stack.push(new Index(x,y));
            		}
            	}
            	
            	x=index.x;
            	y=index.y;
            	//向下走
            	while(x+1<rows&&map[x+1][y]) {
            		x++;
            		if(memory[x][y]!=1) {
            			memory[x][y]=1;
            			count++;
            			stack.push(new Index(x,y));
            		}
            	}
            	
            	x=index.x;
            	y=index.y;
            	//向上走
            	while(x-1>=0&&map[x-1][y]) {
            		x--;
            		if(memory[x][y]!=1) {
            			memory[x][y]=1;
            			count++;
            			stack.push(new Index(x,y));
            		}
            	}
            	
            	
            }
            
            
            
            return count;
        }
        public static boolean canMov(int x,int y,int threshold){
            char []xArr=String.valueOf(x).toCharArray();
            char []yArr=String.valueOf(y).toCharArray();
            int sum=0;
            int xlen=xArr.length;
            int yLen=yArr.length;
            int tem;
            
            for(int i=0;i<xlen;i++){
                tem=xArr[i]-'0';
                sum=sum+tem;
            }
            for(int i=0;i<yLen;i++){
                tem=yArr[i]-'0';
                sum=sum+tem;
            }
            return  threshold>=sum?true:false;
        }
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		System.out.println(movingCount(15, 1, 1));
    
    	}
    
    }
    

全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务