この質問では、DFSを使用してすべてのポイントをトラバースするのではなく、DFSを直接使用して爆弾を爆発させます。これにより、方向ベクトルを使用して検索する必要がなくなります。
#include<cstdio>
#include<iostream>
#include<algorithm>
int MM[1005][1005], n, m, number;
bool row[1005], col[1005];
void dfs(int x, int y){
MM[x][y] = '0';
if(row[x] && col[y])return;
//使用DFS点爆这一行,再进行递归
if(!row[x]){
row[x] = true;
for(int i = 0; i < m;i++){
if(MM[x][i] == '1'){
dfs(x,i);
}
}
}
if(!col[y]){
col[y] = true;
for(int i = 0;i < n;i++){
if(MM[i][y] == '1'){
dfs(i,y);
}
}
}
}
int main(){
while(scanf("%d%d", &n, & m) != EOF){
number = 0;
for(int i = 0;i < n;i++){
getchar();
for(int j = 0; j < m;j++){
scanf("%c",&MM[i][j]);
}
}
for(int i = 0; i < n ;i++){
for(int j = 0; j < m;j++){
if(MM[i][j] == '1'){ //选取还没有被点爆的点
++number;
dfs(i,j);
}
}
}
printf("%d\n",number);
}
return 0;
}