1329 【例8.2】细胞

法一:DFS!!(详细看注释)

#include<bits/stdc++.h>
using namespace std;
int n,m;//行列 
char mp[70][70];//地图 
int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向 
int ans=0;//答案 

void pr(){//测试函数 
    cout<<"--------------"<<endl;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<mp[i][j];
        }
        cout<<endl;
    }
}

void dfs(int x,int y){
    mp[x][y]='0';
    for(int i=0;i<4;i++){
        int nx=x+next[i][0];
        int ny=y+next[i][1];
        
        if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){
//            pr(); 
//            cout<<endl;
            dfs(nx,ny);
        }
    }
}
int main(){
    cin>>n>>m;
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>mp[i][j];
        }

    }
//    pr();
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]!='0'){//当不为‘0’时开始遍历 
                ans++; 
                dfs(i,j);//从当前位置开始遍历 
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

 

 

法二:BFS!!

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
}que[3610];//结构体,方便记录同一个点的横纵坐标 
int fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向 
char mp[70][70]={0};//地图 
int ans=0;//细胞个数 
int f,r;//队首,队尾 
int n,m;//行列 
void pr(){//测试函数 
    cout<<"--------"<<endl;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<mp[i][j];
        }
        cout<<endl;
    }
}
void bfs(int x,int y){
    f=r=1;//初始化队列 
    que[r].x=x , que[r].y=y , mp[x][y]='0';//将初始位置插入队列,并将当前位置改为已访问 
    while(f<=r){
        node t;
        t.x=que[f].x , t.y=que[f].y;//设立新结构体,记录队首横纵坐标 
        
        for(int i=0;i<4;i++){
            int nx=t.x+fx[i][0];//下一个位置的横坐标 
            int ny=t.y+fx[i][1];//下一个位置的纵坐标 
            
            if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){//约束条件 
                mp[nx][ny]='0';//将当前位置更改为‘0’ 
//                pr();
                r++;//为入队做准备 
                que[r].x=nx;
                que[r].y=ny;
            }
        }
        f++;//队首出队 
    }
}
int main(){
    cin>>n>>m; 
    for(int i=0;i<n;i++) cin>>mp[i];
//    pr();
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]!='0'){
                ans++;//只要不是‘0’,答案就+1; 
                bfs(i,j);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2020-10-04 21:16  ssdaeda  阅读(287)  评论(2编辑  收藏  举报