无人机巡逻
从左上开始,一个矩阵,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));
}
}
模拟秒了。
生命游戏,京东第一题都和这个很像。
结束条件是,走到已经走过的地块(证明陷入死循环)