地,顏色與

鏈接: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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章