1249 Lake Counting

本题,我用了两种方法,个人认为DFS要更方便一点,至少从代码量来看是这样的

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
}que[12110];
int fx[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//方向 
char mp[120][120];//地图 
int f,r;//队首队尾 
int n,m;//行列 
int ans;//水洼个数 

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){//DFS方法 
    for(int i=0;i<8;i++){
        int sx=x+fx[i][0];
        int sy=y+fx[i][1];
        
        if(sx>=0 && sx<n && sy>=0 && sy<m && mp[sx][sy]=='W'){
            mp[sx][sy]='.';
            dfs(sx,sy);
        }
    }
}

void bfs(int x,int y){//BFS方法 
    f=r=1;
    que[r].x=x , que[r].y=y , mp[x][y]='.';
    
    while(f<=r){
        node t;
        t.x=que[f].x , t.y=que[f].y;
        
        for(int i=0;i<8;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]=='W'){
                mp[nx][ny]='.';
//                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];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]=='W'){
                ans++;
//                dfs(i,j);
                bfs(i,j);
            }
        }
    }
//    pr();
    cout<<ans<<endl;
    return 0;
}

 第65、66行,比较DFS与BFS

posted @ 2020-10-06 10:56  ssdaeda  阅读(418)  评论(2编辑  收藏  举报