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

机器人的运动范围

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));
    
    	}
    
    }
    

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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