地,颜色与

链接:https://ac.nowcoder.com/acm/contest/218/A
来源:牛客网

现在,你作为一名新星鹏洛客,找到了一块绝佳的修炼地。这块地方可以被描述成一个 n x m 的矩形。你已经在这块地中的一些位置打好了标记。接下去,就该对整块地赋予你的颜色了。一个位置能被赋予你的颜色,当且仅当满足以下条件之一:
    1. 这个位置被打上了标记。
    2. 这个位置在不经过被打标记的位置的情况下与边界不连通(这个图是四联通的)。换句话说,如果你从这个位置开始,在不经过被打标记的位置,且只能向上下左右四个方向移动的情况下永远不能走到地图的边界,那么这个位置符合条件。
    现在,你的好基友想知道,你能为多少个位置赋予你自己的颜色呢?

输入描述:
第一行包含两个正整数 n, m ,表示地图的长和宽。
接下去 n 行,每行一个长为 m 的字符串,表示地图的一行。
其中 表示该位置未被打标记; 表示该位置被打了标记。
保证地图仅由 和 构成。
输出描述:
输出仅一行,包含一个整数,表示你的答案。
示例1
输入
4 4

.###
.#.#
.###
输出
9
备注:
1 ≤ n x m ≤ 106
牛客的题,我用的广搜

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
    int x;
    int y;
    int s;
}que[1000005];
//char a[5005][5005];
//int book[5005][5005];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    char a[n+5][m+5];
    int book[n+5][m+5];
    int sum=0,head,tail,tx,ty,flag;
    memset(book,0,sizeof(book));
    for(int i=0;i<n;i++){
        scanf("%s",a[i]);
    }
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(a[i][j]=='#'){
                sum++;
            }
        }
    }
    for(int i=1;i<n-1;i++){
        for(int j=1;j<m-1;j++){
            if(a[i][j]=='.'&&book[i][j]==0){
                head=1;
                tail=1;
                que[tail].x=i;
                que[tail].y=j;
                que[tail].s=1;
                book[i][j]=1;
                tail++;
                flag=0;
                while(head<tail){
                    for(int k=0;k<=3;k++){
                        tx=que[head].x+next[k][0];
                        ty=que[head].y+next[k][1];
                        //cout<<k<<" "<<next[k][0]<<" "<<next[k][1]<<" "<<i<<" "<<j<<" "<<tx<<" "<<ty<<endl;
                        if(tx<0||ty<0||tx>n-1||ty>m-1){flag=1;continue;}
                        if(a[tx][ty]=='.'&&book[tx][ty]==0)
                        {
                            book[tx][ty]=1;
                            que[tail].x=tx;
                            que[tail].y=ty;
                            que[tail].s=que[tail-1].s+1;
                            tail++;
                        }
                    }
                    //if(flag==1){break;}
                    head++;
                }
            //cout<<tail<<" "<<flag<<endl;
                if(flag==0){sum+=que[tail-1].s;}
            }
        }
    }
    printf("%d\n",sum);
}

猜你喜欢

转载自blog.csdn.net/qq_41336270/article/details/84180029
今日推荐