AcWing 1233. 全球变暖
原题链接
简单
作者:
小呆呆
,
2020-01-22 15:32:41
,
所有人可见
,
阅读 5582
算法分析
- 遍历所有未遍历过的陆地,通过
bfs
计算出当前位置连通陆地的数量total
,以及被淹没陆地的数量bound
,若total == bound
表示完整淹没的一个岛屿
时间复杂度 $O(n^2)$
Java 代码
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main{
static int N = 1010;
static int n;
static char[][] g = new char[N][N];
static boolean[][] st = new boolean[N][N];
static int[] dx = new int[] {-1,0,1,0};
static int[] dy = new int[] {0,1,0,-1};
static boolean bfs(int x,int y)
{
Queue<PIIs> q = new LinkedList<PIIs>();
q.add(new PIIs(x,y));
st[x][y] = true;
int total = 0;//当前位置连通陆地的数量
int bound = 0;//被淹没陆地的数量
while(!q.isEmpty())
{
PIIs t = q.poll();
total ++;
boolean is_bound = false;//判断岛屿是否被淹没
for(int i = 0;i < 4;i++)
{
int a = t.x + dx[i];
int b = t.y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= n) continue;
if(st[a][b]) continue;
if(g[a][b] == '.')
{
is_bound = true;
continue;
}
q.add(new PIIs(a,b));
st[a][b] = true;
}
if(is_bound) bound ++;
}
return total == bound;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
for(int i = 0;i < n;i++)
{
char[] charArray = scan.next().toCharArray();
for(int j = 0;j < n;j++)
{
g[i][j] = charArray[j];
}
}
int cnt = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(!st[i][j] && g[i][j] == '#')
{
if(bfs(i,j)) cnt ++;
}
}
}
System.out.println(cnt);
}
}
class PIIs
{
public int x;
public int y;
public PIIs(int x,int y)
{
this.x = x;
this.y = y;
}
}
感觉题中样例出错了
海平面上升后,应该是
我认为原来三个岛屿,之后也是三个岛屿,答案为零
但是题目中给的答案是1
求大佬指点
题目问的是有多少个岛屿会完全淹没,不是问淹没之前和淹没之后岛屿的数量之差。本例中,有三个连通块,只有一个完全消失了,所以是有一个岛屿被完全淹没
orz
谢谢
时间复杂度应该是O(n) 因为st判重数组保证了每个格子只能被遍历常数次
一共有$n^2$的格子,每个格子保证只能遍历一遍,所以是$O(n^2)$
QAQ好吧 我是吧格子摊开了