大疆笔试----8.18

150 阅读1分钟

无人机巡逻

从左上开始,一个矩阵,0,1组成,1表示障碍物。

初始向右走,遇到边界或者障碍物顺时针旋转90°。无人机一直飞。

问能巡逻的地块多少个?

代码

package dajiang;

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

/**
 * 3 3
 * 0 0 0
 * 1 1 0
 * 0 0 0*/
class Solution {

    /* Write Code Here */
    public int numberOfPatrolBlocks(int[][] block) {
        int row=block.length;
        int col=block[0].length;
        int[][] direction={{0,1},{1,0},{0,-1},{-1,0}};
        boolean[][] v=new boolean[row][col];

        Set<String> vis=new HashSet<>();
        int x=0,y=0;
        int d=0;//表示方向

        while(true){
            //标记当前位置已经被访问
            if(x>=0&&x<row&&y>=0&&y<col&&block[x][y]==0){
                String position=x+","+y;
                if(vis.contains(position)){//如果已经访问过这个位置。停止
                    break;
                }
                vis.add(position);
                v[x][y]=true;
            }else{
                break;//代表超出便边界或者遇到障碍物
            }

            //移动到下一个位置
            int nx=x+direction[d][0];
            int ny=y+direction[d][1];
            if(nx<0||nx>=row||ny<0||ny>=col||block[nx][ny]==1){
                //这个时候要改变方向,超出边界,或者是障碍物
                d=(d+1)%4;
                nx=x+direction[d][0];
                ny=y+direction[d][1];
            }

            //更新无人机的位置
            x=nx;
            y=ny;
        }
        return vis.size();
    }
}

public class one {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int res;

        int block_rows = 0;
        int block_cols = 0;
        block_rows = in.nextInt();
        block_cols = in.nextInt();

        int[][] block = new int[block_rows][block_cols];
        for(int block_i=0; block_i<block_rows; block_i++) {
            for(int block_j=0; block_j<block_cols; block_j++) {
                block[block_i][block_j] = in.nextInt();
            }
        }

        if(in.hasNextLine()) {
            in.nextLine();
        }


        res = new Solution().numberOfPatrolBlocks(block);
        System.out.println(String.valueOf(res));

    }
}

模拟秒了。

生命游戏,京东第一题都和这个很像。

结束条件是,走到已经走过的地块(证明陷入死循环)