洛谷链接:https://www.luogu.com.cn/problem/P1506
import java.util.Scanner;
public class Main {
static int n=0,m=0,s=0;
static int[][] a=new int[501][501];
static int[] kx={0,1,-1,0,0};
static int[] ky={0,0,0,1,-1};
//如果新的数在整个数组范围内并且不是障碍(能走),那么就搜索从这个格子能走到其他哪些格子
public static void dfs(int x,int y) {
a[x][y]=1;
for(int i=1;i<=4;i++){ //向四个方向搜索
int x0=x+kx[i];
int y0=y+ky[i];
if(x0>0 && x0<=n && y0>0 && y0<=m && a[x0][y0]==0) {
dfs(x0,y0);
}
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//输入
n=in.nextInt();
m=in.nextInt();
//初始化数组,将墙标记为1
for(int i=1;i<=n;i++) {
String s=in.next();
for(int j=1;j<=m;j++) {
char c=s.charAt(j-1);
if(c=='*'){
a[i][j]=1; //如果是障碍就输入1
}else {
a[i][j]=0; //可以过就是0
}
}
}
//因为洪水是从四面涌进来的
//搜索第一列和最后一列的格子
for(int i=1;i<=n;i++){
if(a[i][1]==0) dfs(i,1); //如果有能过的就搜索
if(a[i][m]==0) dfs(i,m);
}
//搜索第一行和最后一行的格子
for(int i=1;i<=m;i++){
if(a[1][i]==0) dfs(1,i);
if(a[n][i]==0) dfs(n,i);
}
//最后搜索没有被淹的格子
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0) s++;
}
}
System.out.println(s);
}
}