給出一個二維數組 A,每個單元格為 0(代表海)或 1(代表陸地)。
移動是指在陸地上從一個地方走到另一個地方(朝四個方向之一)或離開網格的邊界。
返回網格中無法在任意次數的移動中離開網格邊界的陸地單元格的數量。
示例 1:
輸入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
輸出:3
解釋:
有三個 1 被 0 包圍。一個 1 沒有被包圍,因為它在邊界上。
解題思路
從網格邊界出發,像網格內部進行深度優先搜索,將可到達的地方全部置為水域,最后遍歷矩陣,找出無法到達的陸地。
代碼
class Solution {public int numEnclaves(int[][] A) {int[][] dir=new int[][]{{-1,0},{1,0},{0,1},{0,-1}};for(int i=0;i<A.length;i++)//遍歷邊界{Enclaves(A, dir,i,0);Enclaves(A, dir,i,A[0].length-1);}for(int i=0;i<A[0].length;i++){Enclaves(A, dir,0,i);Enclaves(A, dir,A.length-1,i);}int ans=0;for(int i=1;i<A.length-1;i++)for(int j=1;j<A[0].length-1;j++)if(A[i][j]==1) ans++;return ans;}public void Enclaves(int[][] A,int[][] dir,int x,int y) {if(x<0||y>=A[0].length||y<0||x>=A.length)return ;if(A[x][y]==0) return ;A[x][y]=0;for(int[] d:dir){int nextX=d[0]+x,nextY=d[1]+y;Enclaves(A, dir, nextX, nextY);}}
}