题目:
分析:
如果他能跨越边界,首先需要一个与边界相邻的1,否则没法进行,于是我们可以开始的时候遍历每个节点,把为1的边界结点记录下来放入队列,并修改1的值(便于与未遍历到的1区分),然后记录不为1的非边界结点的数量sum,然后在队列中取出每个一边界节点,判断其上下左右是否有未遍历到的1,有则总数sum减1,并将该节点放入队列,直到队列为空,此时sum的值为我们要求的值。
代码:
class Solution {
public int numEnclaves(int[][] grid) {
Queue<Integer> q=new LinkedList<Integer>();
int sum=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1){
if(i==0||j==0||i+1==grid.length||j+1==grid[0].length){
grid[i][j]=2;
q.offer(i);
q.offer(j);
}else{
sum++;
}
}
}
}
while(!q.isEmpty()){
int x=q.poll();
int y=q.poll();
sum=aaa(grid,x+1,y,q,sum);
sum=aaa(grid,x-1,y,q,sum);
sum=aaa(grid,x,y+1,q,sum);
sum=aaa(grid,x,y-1,q,sum);
}
return sum;
}
public int aaa(int[][] grid,int x,int y,Queue<Integer> q,int sum){
if(x<0||y<0||x>=grid.length||y>=grid[0].length){
return sum;
}else{
if(grid[x][y]==1){
grid[x][y]=2;
q.offer(x);
q.offer(y);
return sum-1;
}
return sum;
}
}
}