前言
这个题 断断续续 写了俩天,老天爷都看不下去了,让我想到了,也不废话了,只需正确理解题目的一个点就行
题目说:
那么就是说一个岛经过淹没后有没有可能变成两个岛甚至更多岛
如下Intput
9
.........
.###.###.
.###.###.
.###.###.
...###...
...###...
...###...
.##...##.
.........
这个地图本来有3个岛,最上面一个岛经过淹没后变成了3座岛,下面2个岛结果淹没后全没了,所以有2个岛会被完全淹没。
浅贴一下代码,代码看着有点长,实际很好理解,你们“闭着眼睛都能理解的”
package lanqiaobei92;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/*
* 9
.........
.###.###.
.###.###.
.###.###.
...###...
...###...
...###...
#########
.........
9
.........
.###.###.
.###.###.
.###.###.
...###...
...###...
...###...
.##...##.
.........
*/
public class getewarm {
static char[][] cc,cc1;
static boolean[][] bb,bb1;
static int n,ans1=0;
static int[][] aa;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
cc = new char[n][n];
aa = new int[n][n];
bb = new boolean[n][n];
bb1 = new boolean[n][n];
String s = sc.nextLine();
for (int i = 0; i < n; i++) {
s = sc.nextLine();
cc[i] = s.toCharArray();
}
for (int i = 0; i < n; i++) { //you duo shao dao yu
for (int j = 0; j < n; j++) {
if(cc[i][j]=='#'&&!bb1[i][j]) {
ans1++;
BFS(i,j);
}
}
}
bb1 = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(cc[i][j]=='#'&&judge(i,j)) {//
bb[i][j] = true;//需要去除的点,打上标记
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(cc[i][j]=='#'&&bb[i][j]) {// 去除海洋衔接大陆的点
cc[i][j] = '.';
}
}
}
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(cc[i][j]=='#'&&!bb1[i][j]) {
map.put(aa[i][j], aa[i][j]);//
BFS1(i,j);
}
}
}
//System.err.println(ans);
if(ans1<map.size()) {
System.out.println(0);
}else {
System.out.println(ans1-map.size());
}
}
private static void BFS(int i, int j) {//插旗子用,和下面的BFS1基本一样
if(i>=0&&i<=n-1&&j>=0&&j<=n-1) {
if(cc[i][j]=='#'&&!bb1[i][j]) {
aa[i][j] = ans1; //插旗子
bb1[i][j] = true;
//扩展
BFS(i+1,j);
BFS(i-1,j);
BFS(i,j+1);
BFS(i,j-1);
}else {
return ;
}
}else {
return ;
}
}
private static void BFS1(int i, int j) {//第二次不用插旗子
if(i>=0&&i<=n-1&&j>=0&&j<=n-1) {
if(cc[i][j]=='#'&&!bb1[i][j]) {
bb1[i][j] = true;
//扩展
BFS(i+1,j);
BFS(i-1,j);
BFS(i,j+1);
BFS(i,j-1);
}else {
return ;
}
}else {
return ;
}
}
private static boolean judge(int i,int j) {//判断 需要变成海洋的点
if(cc[i-1][j]=='.'||cc[i+1][j]=='.'||
cc[i][j-1]=='.'||cc[i][j+1]=='.') {
return true;
}
return false;
}
}