牛客算法周周练19-E、地、颜色、魔法【BFS】

题目链接
题意:给定一个由'.','#'组成的n*m 1 ≤ n ∗ m ≤ 106 1 ≤ n *m ≤ 106 1nm106网格,其中被'#'包围的全部可以变成'#',问你最后有多少个'#'。(和原题描述有点差别 不过就是这意思)
思路:处理每一个网格显然很难判断,我们直接逆向思维,把和边界相连的'.'BFS标记一下即可。然后没有被标记的就是最后答案了。
AC代码(第一次写这么长,其实可以简化不少的,不过一A还是挺好的):

#include 
#define ll long long
#define ull unsigned long long
#define db double
using namespace std;

const int N = 1e6 + 10;
int T;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
bool vis[N];
signed main()
{
    ll n,m,cnt=0;
    cin>>n>>m;
    string str[n];
    for(ll i=0;i<n;i++)
        cin>>str[i];
    queue<ll > Q;
    for(int i=0;i<n;i++){
        if(str[i][0]=='.'&&!vis[i*m]){
            cnt++;
            Q.push(i*m);
            vis[i*m]=true;
            while(!Q.empty()){
                ll x0=Q.front()/m,y0=Q.front()%m;Q.pop();
                for(int j=0;j<4;j++){
                    ll x1=x0+dx[j],y1=y0+dy[j];
                    if(x1<n&&x1>=0&&y1>=0&&y1<m){
                        if(!vis[x1*m+y1]&&str[x1][y1]=='.') {
                            Q.push(x1*m+y1);
                            vis[x1*m+y1]=true;
                            cnt++;
                        }
                    }
                }
            }
        }
        if(str[i][m-1]=='.'&&!vis[i*m+m-1]){
            cnt++;
            Q.push(i*m+m-1);
            vis[i*m+m-1]=true;
            while(!Q.empty()){
                ll x0=Q.front()/m,y0=Q.front()%m;Q.pop();
                for(int j=0;j<4;j++){
                    ll x1=x0+dx[j],y1=y0+dy[j];
                    if(x1<n&&x1>=0&&y1>=0&&y1<m){
                        if(!vis[x1*m+y1]&&str[x1][y1]=='.') {
                            Q.push(x1*m+y1);
                            vis[x1*m+y1]=true;
                            cnt++;
                        }
                    }
                }
            }
        }
    }
    for(int i=1;i<m-1;i++){
        if(str[0][i]=='.'&&!vis[i]){
            cnt++;
            Q.push(i);
            vis[i]=true;
            while(!Q.empty()){
                ll x0=Q.front()/m,y0=Q.front()%m;Q.pop();
                for(int j=0;j<4;j++){
                    ll x1=x0+dx[j],y1=y0+dy[j];
                    if(x1<n&&x1>=0&&y1>=0&&y1<m){
                        if(!vis[x1*m+y1]&&str[x1][y1]=='.') {
                            Q.push(x1*m+y1);
                            vis[x1*m+y1]=true;
                            cnt++;
                        }
                    }
                }
            }
        }
        if(str[n-1][i]=='.'&&!vis[(n-1)*m+i]){
            cnt++;
            Q.push((n-1)*m+i);
            vis[(n-1)*m+i]=true;
            while(!Q.empty()){
                ll x0=Q.front()/m,y0=Q.front()%m;Q.pop();
                for(int j=0;j<4;j++){
                    ll x1=x0+dx[j],y1=y0+dy[j];
                    if(x1<n&&x1>=0&&y1>=0&&y1<m){
                        if(!vis[x1*m+y1]&&str[x1][y1]=='.') {
                            Q.push(x1*m+y1);
                            vis[x1*m+y1]=true;
                            cnt++;
                        }
                    }
                }
            }
        }
    }
    cout<<(n*m-cnt)<<endl;
    return 0;
}

你可能感兴趣的:(牛客,bfs,算法)