dfs--エリア

問題B:エリア
制限時間:1秒メモリ制限:128メガバイト
[提出] [状態]
タイトル説明
0の一方と図の組成、プログラム「によって算出領域を」パターンに囲まれました。統計計算エリア数が数0の閉曲線に囲まれています。
入力
0から、の組成を示す
出力
の数面積を
サンプル入力コピー
000000000は
0000 ** 000
000
00
00
00 000 00
000 000 ***
000000000
サンプル出力コピー
。5

#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int M = 100005;
int n,m;
char mp[100][100];
bool vis[100][100];
int nex[4][2] = {0,1,0,-1,1,0,-1,0};
void dfs(int x,int y){
    for(int i=0; i<4; i++){
        int xx = x + nex[i][0];
        int yy = y + nex[i][1];
        if(xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy] && mp[xx][yy]=='0'){
            vis[xx][yy]=1;
            dfs(xx,yy);
        }
    }
}
int main()
{
    n=0;
    while(~scanf("%s",mp[n])){
        n++;
    }
    m = strlen(mp[0]);
//    cout << n << m;
    memset(vis,0,sizeof(vis));
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++){
            if((i==0 || i==n-1 || j==0 || j==m-1) && mp[i][j]=='0'){
                vis[i][j] = 1;
                dfs(i,j);
            }
        }
    int ans = 0;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(mp[i][j]=='0' && !vis[i][j]) ans++;
    cout << ans << endl;
    return 0;
}


IF((I = = 0 || I = = N-1 || J = = 0 || J = = M-1)&& MP [I] [J] = = '0')

アイデア:一番外側の円の四辺を周りに掃引するように、最終集計がタグ付けされていません
注:与えられたいくつかの奇数行はありませんが、あなたは自問する必要があります

公開された62元の記事 ウォンの賞賛0 ビュー1760

おすすめ

転載: blog.csdn.net/jhckii/article/details/104247901
おすすめ