一二三四五 上山打老虎

蓝桥杯-红与黑

链接:https://www.acwing.com/problem/content/1115/

代码:
bfs:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
char s[25][25];
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
int n,m;
void bfs(int x,int y){
    int ans=1;
    queue<pair<int,int>>q;
    q.push({x,y});
    s[x][y]='#';
    while(q.size()){
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(int i=0;i<4;i++){
            int a=x+dx[i];
            int b=y+dy[i];
            if(a<1||b<1||a>n||b>m||s[a][b]=='#')continue;
            ans++;
            q.push({a,b});
            s[a][b]='#';
        }
    }
    cout<<ans<<endl;
}
int main (){
    while(cin>>m>>n&&(n+m)){
        for(int i=1;i<=n;i++)
            cin>>(s[i]+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            if(s[i][j]=='@')bfs(i,j);
    }
    
    
    return 0;
}

dfs:

#include<bits/stdc++.h>

using namespace std;
char s[25][25];
int b[25][25];
int dx[]={0,-1,1,0};
int dy[]={-1,0,0,1};
int n,m;
void dfs(int x,int y){
   // cout<<x<<" "<<y<<endl;
    if(x<1||y<1||x>n||y>m||s[x][y]=='#')return ;
    b[x][y]=1;
    for(int i=0;i<4;i++){
        int l=x+dx[i];
        int r=y+dy[i];
        if(!b[l][r])dfs(l,r);
    }
}
int main (){
    cin>>m>>n;
    while(n!=0&&m!=0){
        for(int i=1;i<=n;i++)
            cin>>(s[i]+1);
        memset(b,0,sizeof(b));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            if(s[i][j]=='@'){
                dfs(i,j);
            }
        int ans=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        ans+=b[i][j];
        cout<<ans<<endl;
        cin>>m>>n;
    }
    
    
    return 0;
}
posted @ 2021-04-15 10:49  黒川川  阅读(66)  评论(0)    收藏  举报