题目:
思路:附在代码中
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
/***
* 思路
* 1. 使用dfs遍历整个表单,将所有连续的”O“出现的次数全都遍历出来,返回每个连续的”O“的大小
* 2. 将每个连续的”O“的坐标遍历一遍,找到边界的坐标,并将其存储在set中, 比如{”1 0“,”2 0“}
* 3. 若set的size为0,则该连续的”0“不满足条件
* 若set的size为1,将该set的值坐标和该连续的”0“的大小存储在String[2]数组中,
* 例如:["3, 0", 6] 并将string[2]数组存储在list<string[]>中
* 4. 判断list的大小
* 若list的size为0,输出null
* 若list的size为1,说明整个表单中只有一个连续的”0“满足条件,将list【0】中的值按题目要求格式输出即可
* 若list的size不为0和1,说明有多个连续的”O“满足条件,遍历整个list,找到最大的连续的”0“的值maxarea.
* 再次遍历整个list,将所有的maxarea的坐标的索引找到存放在list2中,
*
* 判断list2的size: 若size为1,将list.get(list2.get(0))的值按照题目要求输出
* 若size不为1,将list.get(list2.get(0))的值中的area的大小直接输出就好
*
*/
public class SearchKongXianArea {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int row = Integer.parseInt(scanner.next());
int column = Integer.parseInt(scanner.next());
String[][] arr = new String[row][column];
for (int i = 0; i < row; i++){
for (int j = 0; j < column; j++){
arr[i][j] = scanner.next();
}
}
//将有边界的连续的”0“且边界只有一个的坐标以及area存放在list中
ArrayList<String[]> list = new ArrayList<>();
for (int i = 0; i < row; i++){
for (int j = 0; j < column; j++){
if (arr[i][j].equals("O")){
//请求dfs,将满足边界的坐标存放在set中。
HashSet<String> set = new HashSet<>();
int area = bfs(arr,i,j,set);
if (set.size()==1){
String[] strings = {String.valueOf(area),set.iterator().next()};
list.add(strings);
}
}
}
}
if (list.size()==0){
System.out.println("NULL");
return;
}
if (list.size() == 1){
System.out.print(list.get(0)[1]);
System.out.print(" "+list.get(0)[0]);
return;
}
int maxArea =0;
for (int i = 0; i < list.size(); i++){
int area = Integer.parseInt(list.get(i)[0]);
if (area > maxArea){
maxArea = area;
}
}
ArrayList<Integer> index = new ArrayList<>();
for (int i = 0; i < list.size(); i++){
int area = Integer.parseInt(list.get(i)[0]);
if (area == maxArea){
index.add(i);
}
}
if (index.size()==1){
System.out.print(list.get(index.get(0))[1]);
System.out.print(" "+list.get(index.get(0))[0]);
}else {
System.out.println(maxArea);
}
}
public static int bfs(String[][] strings, int i, int j, HashSet<String> set){
if (!isArea(strings,i,j)){
return 0;
}
if (!strings[i][j].equals("O")){
return 0;
}
strings[i][j] = "P";
if (isBianJie(strings,i,j)){
set.add(i+" "+j);
}
return 1+bfs(strings,i-1,j,set)+bfs(strings,i+1,j,set)+bfs(strings,i,j-1,set)+bfs(strings,i,j+1,set);
}
public static boolean isArea(String[][] strings, int r, int c){
int row = strings.length;
int column = strings[0].length;
return r>=0 && r <row && c >=0 && c<column;
}
public static boolean isBianJie(String[][] strings,int i, int j){
int row = strings.length;
int column = strings[0].length;
if (i==0){
return true;
}
if (i==row-1){
return true;
}
if (j==0){
return true;
}
if (j==column-1){
return true;
}
return false;
}
}