看了一下java的题解比较少,来发表一下Java AC代码。用的是DFS,染色题型。
import java.util.*;
public class Main{
static Scanner sc=new Scanner(System.in);
static int N=sc.nextInt();
static int M=sc.nextInt();
static char a[][]=new char[501][501];
static int dx[]= {0,1,0,-1};
static int dy[]= {1,0,-1,0};
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<=N;i++)
{
String s=sc.next();
for(int j=1;j<=M;j++)
{
a[i][j]=s.charAt(j-1);
}
}
//本质上就是外围的0全部被淹没,里面被包围的0幸存 因此从外围开始dfs,把外围的0全都染色了
for(int i=1;i<=M;i++) //这里的N和M搞错了!固定行,求列应该用M
{
//第一行
if(a[1][i]=='0') dfs(1,i);
//最后一行
if(a[N][i]=='0') dfs(N,i);
}
for(int j=1;j<=N;j++)
{
//第一列
if(a[j][1]=='0') dfs(j,1);
//最后一列
if(a[j][M]=='0') dfs(j,M);
}
int count=0;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
if(a[i][j]=='0') count++;
}
}
System.out.println(count);
}
public static void dfs(int x,int y)
{
a[x][y]=3; //先染色
for(int i=0;i<4;i++)
{
int newx=x+dx[i];
int newy=y+dy[i];
if(newx>=1&&newx<=N&&newy>=1&&newy<=M&&a[newx][newy]=='0')
{
//不越界且为0,则继续给这些外围的0染色
dfs(newx,newy);
}
}
}
}