同一行只要引爆了一个炸弹、其他的就都会引爆、开始做题目的时候、我想到的是dfs,扔进去遍历、提交的的时候,因为是模拟比赛、所以,只能看到前面的几个,样例都通过了,然后比赛结束,发现最后面的三道测试把我卡住了、
import java.util.Scanner;
public class I {
static final int MAXN = 1005;
static char [][] map = new char[MAXN][MAXN];
static int N, M;
static int res = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
N = input.nextInt();
M = input.nextInt();
for(int i = 0; i < N; i++){
map[i] = input.next().toCharArray();
}
/* for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
System.out.print(map[i][j] + " ");
}
System.out.println("");
}*/
res = 0;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(map[i][j] == '1'){
dfs(i, j);
res++;
}
}
}
System.out.println(res);
}
public static void dfs(int x, int y){ // 给出的坐标、、
map[x][y] = '0';
for(int i = 0; i < N; i++){ // y列遍历一遍、、
if(map[i][y] == '1'){
dfs(i, y);
}
}
for(int i = 0; i < M; i++){
if(map[x][i] == '1'){
dfs(x, i);
}
}
}
}
百度之后改用并查集、 看代码:
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class I_ {
static int [] f = new int [2005];
static char [][] c = new char [1005][1005];
static int N, M;
public static void main(String[] args) {
Set<Integer> ans = new HashSet<>(); // set去重
ans.clear();
Scanner input = new Scanner(System.in);
N = input.nextInt();
M = input.nextInt();
for(int i = 0; i < N; i++){
c[i] = input.next().toCharArray(); // 输入没有问题、、
}
/* for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
System.out.print(c[i][j] + " ");
}
System.out.println("");
}*/
Init();
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(c[i][j] == '1'){
Union(i, j + N);
}
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
if(c[i][j] == '1'){
ans.add(find(f[i]));
ans.add(find(f[j + N]));
}
}
}
System.out.println(ans.size());
}
private static void Union(int i, int j){
int fx = find(i);
int fy = find(j);
if(fx != fy){
f[fx] = fy;
}
}
private static int find(int x){
return f[x] == x ? x : (f[x] = find(f[x]));
}
private static void Init(){
for(int i = 0; i < 2005; i++){
f[i] = i;
}
}
}