蓝桥杯——全球变暖
标题:全球变暖
你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
1
import java.util.Scanner; public class Main { static char [][] maze = new char[100][100];//保存淹没前的海岛 static int n; static char [][] mazeend = new char[100][100];//保存淹没后的海岛 static int [][] pdf = {{1,0},{0,1},{-1,0},{0,-1}};//四个方向 static boolean [][] vis = new boolean[100][100]; static int count=0;//记录总数 public static void chongzhi() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { mazeend[i][j] = '.'; } } } public static boolean in(int x,int y) { boolean m = true; for(int i=0;i<4;i++) { int dx = x+pdf[i][0]; int dy = y+pdf[i][1]; if(dx<0||dx>=n||dy<0||dy>=n)//越界 { continue; } if(maze[dx][dy] == '.')//找到海水 { m = false; break; } } return m; } public static void yanmo()//将海岛淹没 { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(maze[i][j] == '#')//当找到陆地时 { if(in(i,j))//四周都为陆地,或者是边界 { mazeend[i][j] = '#'; } } } } } public static void dfs(int x,int y) { if(x<0||x>=n||y<0||y>=n||vis[x][y]||mazeend[x][y] == '.') { return; } vis[x][y] = true; for(int i=0;i<4;i++) { dfs(x+pdf[i][0], y+pdf[i][1]); } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); for(int i=0;i<n;i++) { maze[i] = scanner.next().toCharArray(); } chongzhi(); yanmo(); for(int i=0;i<n;i++)//遍历被淹过之后的岛屿 { for(int j=0;j<n;j++) { if(mazeend[i][j] == '#'&&!vis[i][j])//是岛并且没有被标记过 { count += 1; dfs(i, j); } } } System.out.print(count); } }
import java.util.Scanner;
public class 全球变暖{static char [][] maze = new char[100][100];//保存淹没前的海岛static int n;static char [][] mazeend = new char[100][100];//保存淹没后的海岛static int [][] pdf = {{1,0},{0,1},{-1,0},{0,-1}};//四个方向static boolean [][] vis = new boolean[100][100];static int count=0;//记录总数public static void chongzhi(){for(int i=0;i<n;i++){for(int j=0;j<n;j++){mazeend[i][j] = '.';}}}public static boolean in(int x,int y){boolean m = true;for(int i=0;i<4;i++){int dx = x+pdf[i][0];int dy = y+pdf[i][1];if(dx<0||dx>=n||dy<0||dy>=n)//越界{continue;}if(maze[dx][dy] == '.')//找到海水{m = false;break;}}return m;}public static void yanmo()//将海岛淹没{for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(maze[i][j] == '#')//当找到陆地时{if(in(i,j))//四周都为陆地,或者是边界{mazeend[i][j] = '#';}}}}}public static void dfs(int x,int y){if(x<0||x>=n||y<0||y>=n||vis[x][y]||mazeend[x][y] == '.'){return;}vis[x][y] = true;for(int i=0;i<4;i++){dfs(x+pdf[i][0], y+pdf[i][1]);}}public static void main(String[] args){// TODO Auto-generated method stubScanner scanner = new Scanner(System.in);n = scanner.nextInt();for(int i=0;i<n;i++){maze[i] = scanner.next().toCharArray();}chongzhi();yanmo();for(int i=0;i<n;i++)//遍历被淹过之后的岛屿{for(int j=0;j<n;j++){if(mazeend[i][j] == '#'&&!vis[i][j])//是岛并且没有被标记过{count += 1;dfs(i, j);}}}System.out.print(count);}
}