爆発した爆弾-JieSuanke

この質問では、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;
}

 

 

おすすめ

転載: blog.csdn.net/qq_40596572/article/details/103322809