蓝桥杯——全球变暖

标题:全球变暖

你有一张某海域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);}
}

 

posted @ 2019-03-03 16:41  池塘之底  阅读(256)  评论(0编辑  收藏  举报