Java蓝桥杯 全桥变暖dfs搜索

全球变暖
你有一张某海域NxN像素的照片,“。”表示海洋,“#”表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。  
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。  
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。  
【输入格式】
第一行包含一个整数N.(1 <= N <= 1000)  
以下N行N列代表一张海域照片。  
照片保证第1行,第1列,第N行,第N列的像素都是海洋。  
【输出格式】
一个整数表示答案。


【输入样例】

.......
.##....
.##....
....##.
..####.
...###.
.......  
【输出样例】
1  
资源约定:
峰值内存消耗(含虚拟机)<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。

package czy0115.ex;

import java.util.Scanner;

public class Main {
    static char[][] island = new char[7][7];
    static boolean[][] visit = new boolean[7][7];
    static boolean[][] sign = new boolean[7][7];
    static int[][] dir1 = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, -1}, {1, 1}, {-1, -1}, {-1, 1}};
    static int[][] dir2={{1,0},{-1,0},{0,1},{0,-1}};
    static int nums;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 7; i++) {
            island[i] = sc.next().toCharArray();
        }
        System.out.println(count(island));
        flood(island);
        sink(island);
        for(int i=0;i<7;i++)
            System.out.println(island[i]);
    }

    public static int count(char[][] island) {
        nums = 0;
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++) {
                if (island[i][j] == '#' && !visit[i][j]) {
                    visit[i][j] = true;
                    nums++;
                    find(island, i, j);
                }
            }
        }

        return nums;
    }

    public static void find(char[][] island, int i, int j) {
        for (int k = 0; k < 8; k++) {
            i = i + dir1[k][0];
            j = j + dir1[k][1];
            if (i >= 0 && i < 7 && j >= 0 && j < 7 && island[i][j] == '#' && !visit[i][j]) {
                visit[i][j] = true;
                find(island, i, j);
            }
        }
    }

    public static void flood(char[][] island) {
        for (int i = 0; i < 7; i++) {

            for (int j = 0; j < 7; j++) {
                if (island[i][j] == '#') {
                    for (int k = 0; k < 4; k++) {
                        int x = i + dir2[k][0];
                        int y = j + dir2[k][1];
                        if (x >= 0 && x < 7 && y >= 0 && y < 7 && island[x][y] == '.') {
                            sign[i][j] = true;
                        }
                    }
                }
            }
        }
    }
    //攀爬过山顶之后才会看到更好的世界
    public static void sink(char[][] island){
        for(int i=0;i<7;i++){
            for(int j=0;j<7;j++){
                if (sign[i][j]){
                    island[i][j]='.';
                }
            }
        }
    }
}

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值