计数岛屿:深度优先搜索与广度优先搜索
import java.util.*;
public class Main {
static int n,m;
static int [][]graph; //图
static int [][]visited; //是否访问
static Deque<int[]> deque; //广搜队列
//向量
static int dx[]={-1,0,1,0};
static int dy[]={0,1,0,-1};
static int result=0; //结果
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
graph =new int [n][m];
visited =new int [n][m];
deque =new ArrayDeque<>();
for (int i = 0; i <n ; i++) {
for (int j = 0; j <m ; j++) {
graph[i][j]=in.nextInt();
}
}
//遍历图,当找到合法陆地的时候送入搜索逻辑
for (int i = 0; i < n; i++) {
for (int j = 0; j <m ; j++) {
if (graph[i][j]==1&&visited[i][j]!=1)
{
result++;
//深搜与广搜二选一
// dfs(i,j);
bfs(i,j);
}
}
}
System.out.println(result);
}
//bfs
static void bfs(int x,int y){
//初始元素入队
deque.offer(new int[]{x,y});
visited[x][y]=1;
//将节点的上下左右送入队列并判断合法性
while (!deque.isEmpty()){
int [] cur=deque.poll();
for (int i = 0; i <4 ; i++) {
int nextx=dx[i]+cur[0];
int nexty=dy[i]+cur[1];
//发生越界,已访问或者是水地则continue
if (nextx<0||nextx>=n||nexty<0||nexty>=m||graph[nextx][nexty]==0||visited[nextx][nexty]==1) {
continue;
}
visited[nextx][nexty]=1;#牛客AI配图神器#
deque.offer(new int[]{nextx,nexty});
}
}
}
//递归逻辑,找到相连的陆地并标记访问过,直到碰到水和访问过的陆地则返回
static void dfs(int x,int y){
//当碰到水或者已经是拜访过的陆地就终止
if(visited[x][y]==1||graph[x][y]==0){
return;
}
visited[x][y]=1;
for (int i = 0; i <4; i++) {
int nextx=dx[i]+x;
int nexty=dy[i]+y;
if(nextx<0||nextx>=n||nexty<0||nexty>=m){
continue;
}
dfs(nextx,nexty);
//由于并不需要记录路径,所以不需要回溯
}
}
}
public class Main {
static int n,m;
static int [][]graph; //图
static int [][]visited; //是否访问
static Deque<int[]> deque; //广搜队列
//向量
static int dx[]={-1,0,1,0};
static int dy[]={0,1,0,-1};
static int result=0; //结果
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
graph =new int [n][m];
visited =new int [n][m];
deque =new ArrayDeque<>();
for (int i = 0; i <n ; i++) {
for (int j = 0; j <m ; j++) {
graph[i][j]=in.nextInt();
}
}
//遍历图,当找到合法陆地的时候送入搜索逻辑
for (int i = 0; i < n; i++) {
for (int j = 0; j <m ; j++) {
if (graph[i][j]==1&&visited[i][j]!=1)
{
result++;
//深搜与广搜二选一
// dfs(i,j);
bfs(i,j);
}
}
}
System.out.println(result);
}
//bfs
static void bfs(int x,int y){
//初始元素入队
deque.offer(new int[]{x,y});
visited[x][y]=1;
//将节点的上下左右送入队列并判断合法性
while (!deque.isEmpty()){
int [] cur=deque.poll();
for (int i = 0; i <4 ; i++) {
int nextx=dx[i]+cur[0];
int nexty=dy[i]+cur[1];
//发生越界,已访问或者是水地则continue
if (nextx<0||nextx>=n||nexty<0||nexty>=m||graph[nextx][nexty]==0||visited[nextx][nexty]==1) {
continue;
}
visited[nextx][nexty]=1;#牛客AI配图神器#
deque.offer(new int[]{nextx,nexty});
}
}
}
//递归逻辑,找到相连的陆地并标记访问过,直到碰到水和访问过的陆地则返回
static void dfs(int x,int y){
//当碰到水或者已经是拜访过的陆地就终止
if(visited[x][y]==1||graph[x][y]==0){
return;
}
visited[x][y]=1;
for (int i = 0; i <4; i++) {
int nextx=dx[i]+x;
int nexty=dy[i]+y;
if(nextx<0||nextx>=n||nexty<0||nexty>=m){
continue;
}
dfs(nextx,nexty);
//由于并不需要记录路径,所以不需要回溯
}
}
}
全部评论
相关推荐