2018蓝桥杯全球变暖B组(JAVA)(简介代码)

思路与反思:这题拿到之后的第一个想法就是:二维数组,判断其上下左右是否与指定的中间的字符相等.我需要用两个计数器,一个计数完全不会被淹没的岛屿,一个是岛屿数目,最后拿岛屿数目减去完全不会被淹没的岛屿数目,这样剩的就是会被淹没的岛屿,并且为了不让其重复,每次把找到的岛屿全部换成指定的符号,这样就不会重复了,并且为了保证第一行最后一行,第一列最后一列为. 直接遍历赋值,因为无论输入什么保证就行了,而且题目没说只要是点退出或者不算之类的话。

奈何java没有直接输入字符的,尽管输入字符可以借助字符串的操作来实现,但是我还是感觉麻烦了,于是想着还是用最简单的分隔赋值吧。

第一步:二维字符串数组 ,存放每一个字符。

第二步:用一个字符串一维数组来实现一行输入并且分隔,因为我需要用字符串的方法来判断其是否相等。

总体的思路与代码的实现如下:

/**
* 如果 a[i,j]  ,他的上是[ i-1,j],  下   a[i+1,j], 左 a [i,j-1]  右 a[i,j+1]
*/


标题:全球变暖

你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。  

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。  

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。  

【输入格式】
第一行包含一个整数N。  (1 <= N <= 1000)  
以下N行N列代表一张海域照片。  

照片保证第1行、第1列、第N行、第N列的像素都是海洋。  

【输出格式】
一个整数表示答案。

【输入样例】

.......
.##....
.##....
....##.
..####.
...###.
.......  

【输出样例】
1  

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader sr = new BufferedReader(new InputStreamReader(System.in));//使用流的方式输入,节省输入时间
        int n = Integer.parseInt(sr.readLine()); //把开始的数字转换为整数
        String a[][] = new String[n][n]; //定义一个二维字符串数组
        int count = 0; //定义完全不会被淹没的一个计数器
        int flag = 0;//定义岛屿的计数器
        /**
         * 如果 a[i,j]  ,他的上是[ i-1,j],  下   a[i+1,j], 左 a [i,j-1]  右 a[i,j+1]
         */
        for(int i=0;i<n;i++) {
            String attr[] = sr.readLine().split("");//一个一维字符串,把其中每一字符存入
            for(int j=0;j<n;j++) {
                    a[i][j]=attr[j]; //把每一行的的每个字符都当做其中的一个字符串 赋值
            }
        }
        //保证所有的第一行第一列最后一行最后一列为.
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                a[0][j]=".";//第一行
                a[n-1][j]=".";//最后一行
            }
            a[i][0]=".";//第一列
            a[i][n-1]=".";//最后一列
        }
        //先找 完全不会被淹没的岛屿
        for(int i=1;i<n-1;i++) {
            for(int j=1;j<n-1;j++) {
                //这步就是逻辑结构了,判断其上下左右并其是#号即可
                if (a[i][j].equals(a[i-1][j])&&a[i][j].equals(a[i+1][j])&&a[i][j].equals((a[i][j-1]))&&a[i][j].equals(a[i][j+1])&&a[i][j].equals("#")){
                   count++;
                }
            }
        }
        //找岛屿 并且把岛屿找到时候全部替换为指定的字符串 *
        for(int i=1;i<n-1;i++) {
            for(int j=1;j<n-1;j++) {
              if("#".equals(a[i][j])&&"#".equals(a[i][j+1])&&"#".equals(a[i+1][j])&&"#".equals(a[i+1][j+1])){
                    flag++;
                  a[i][j]=a[i][j].replace("#","*");
                  a[i][j+1]=a[i][j+1].replace("#","*");
                  a[i+1][j]=a[i+1][j].replace("#","*");
                  a[i+1][j+1]=a[i+1][j+1].replace("#","*");
              }
            }
        }

        System.out.println(flag-count);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41479464/article/details/88622327