标签:tx ty int dfs 最短 len2 len1 leetcode934
https://leetcode-cn.com/problems/shortest-bridge/
给定一个数组。数组中包含两个岛屿。求两个岛屿之间的最短距离。
采用找岛屿的方式(DFS),把其中的一个岛屿全部标记为2。并且用一个queue来存储上,此时采用BFS根据queue中的每一个节点逐步向外扩,直到遇到第一个数字1,也就找到了最短的距离。
class Solution {
public int shortestBridge(int[][] A) {
int len1 = A.length;
int len2 = A[0].length;
Queue<int[]> q = new LinkedList<int[]>();
boolean found = false;
for(int i = 0; i<A.length && !found; i++){
for(int j=0; j<A[0].length && !found; j++){
if(A[i][j]==1){
dfs(A,i,j,q);
found = true;
}
}
}
int[][] dic = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
int step = 0;
while(!q.isEmpty()){
int size = q.size();
while(size>0){
int x = q.peek()[0];
int y = q.peek()[1];
q.poll();
for(int i = 0; i<4; i++){
int tx = x + dic[i][0];
int ty = y + dic[i][1];
if(tx<0 || ty<0 || tx>=len1 || ty>=len2 || A[tx][ty]==2){
continue;
}
if(A[tx][ty] == 1){
return step;
}
A[tx][ty] = 2;
q.add(new int[]{tx,ty});
}
size--;
}
step++;
}
return -1;
}
private void dfs(int[][] A, int i, int j, Queue<int[]> q){
int len1 = A.length;
int len2 = A[0].length;
if(i<0 || j<0 || i>=len1 || j>=len2 || A[i][j]!=1){
return;
}
A[i][j] = 2;
q.add(new int[]{i,j});
dfs(A,i-1,j,q);
dfs(A,i+1,j,q);
dfs(A,i,j-1,q);
dfs(A,i,j+1,q);
}
}
标签:tx,ty,int,dfs,最短,len2,len1,leetcode934 来源: https://blog.csdn.net/xiaobailaji/article/details/116483559
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。