在本题中给定一个方形区域,在区域内有 w(wall) 和 l(land) 两个形式的字符,现需要你编写一个程序将该区域内所有的联通的l小室找出来。联通的小室指的是该区域内的所有字符可以通过上下和左右的行走到达,而不会撞到墙(wall)。
输入输出格式
输入格式
第一行有两个整数m, n
,表示数组方形区域的长宽(m
表示行数,n
表示列数);
第二行按照上一行的输入,对方形区域进行输入,该区域只会包含w
和l
两种字符。
输出格式
一行输出数据,表示该连通区域具有多少个独立的连通小室。输入输出样例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个联通小室,分别是:
- (0, 1),(1, 0),(1, 1);
- (2, 2);
- (3, 0);
- (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);
}
}