java寻找连通块

在本题中给定一个方形区域,在区域内有 w(wall) 和 l(land) 两个形式的字符,现需要你编写一个程序将该区域内所有的联通的l小室找出来。联通的小室指的是该区域内的所有字符可以通过上下和左右的行走到达,而不会撞到墙(wall)。

输入输出格式

输入格式
第一行有两个整数 m, n,表示数组方形区域的长宽(m表示行数,n表示列数);
第二行按照上一行的输入,对方形区域进行输入,该区域只会包含
wl两种字符。
输出格式
一行输出数据,表示该连通区域具有多少个独立的连通小室。

输入输出样例1

输入
3 3
w w w
w w w
w w w

输出
0
解释(可选)
方形区域内全部都是wall,没有land。

输入输出样例2

输入
4 5
w l w l l
l l w w l
w w l w l
l w w l l

输出
4
解释(可选)
通过分析可以得到该区域内有4个联通小室,分别是:

  1. (0, 1),(1, 0),(1, 1);
  2. (2, 2);
  3. (3, 0);
  4. (0, 3), (0, 4), (1, 4), (2, 4), (3, 4), (3,3)。

注:从0开始编码。

说明提示

-1≤n≤150
-1≤m≤150

 思路

这道题使用循环加递归比较好写,遍历的时候如果碰到w,就把w所在的位置递归判断下,左,右,是否还是w,如果还是w,接着递归,递归函数完成一次后,总数加一。

import java.util.Scanner;

public class Main {
    public static char[][] atlas;
    public static int h = 4, w = 5, count = 0;

    public static void alter(int i, int j) {
        if (atlas[i][j] == 'l' || atlas[i][j] == 'k')
            return;
        atlas[i][j] = 'k';
        //左边是否有w
        if (j > 0)
            alter(i, j - 1);
        //右边是否有w
        if (j < w - 2)
            alter(i, j + 1);
        //下边是否有w
        if (i < h - 2)
            alter(i + 1, j);
    }

    public static void fun() {
        for (int i = 0; i < h; i++)
            for (int j = 0; j < w; j++)
                if (atlas[i][j] == 'w') {
                    alter(i, j);
                    count++;
                }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入行数:");
        h = scanner.nextInt();
        System.out.print("输入列数:");
        w = scanner.nextInt();
        atlas = new char[h][w];
        System.out.println("请输入元素(例如:llllw,中间不能有空格)!");
        for (int i = 0; i < h; i++) {
            System.out.format("输入第%d行:", i + 1);
            String str = scanner.next();
            for (int j = 0; j < w; j++) {
                atlas[i][j] = str.charAt(j);
            }
        }

        //避免全是w
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                if (atlas[i][j] != 'w') {
                    fun();
                    System.out.println(count);
                    return;
                }
            }
        }
        System.out.println(0);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值