蓝桥杯_DFS_全球变暖

    

// DFS
#include<bits/stdc++.h>
using namespace std;
#define mem( a,v ) memset( a,v,sizeof(a) )

const int N=1111;
char mp[N][N];
bool used[N][N];

int dx[4]={ -1,1,0,0 };     // 上下左右
int dy[4]={ 0,0,-1,1 };

int flag;                   // ==1 存在高地, ==0 被淹没

void dfs( int x,int y )
{
    int i,nx,ny;

    used[x][y]=1;

    for( i=0;i<4;i++ )              // 判断高地
        if( mp[ x+dx[i] ][ y+dy[i] ] != '#' ) break;
    if( i==4 ) flag=1;

    for( i=0;i<4;i++ )          // 标记整个岛屿
    {
        nx=x+dx[i],ny=y+dy[i];
        if( used[nx][ny]==0 && mp[nx][ny]=='#' ) dfs( nx,ny );
    }
}

void init()
{
    mem(mp,0);
    mem(used,0);
    // memset( mp,0,sizeof( mp ) );
    // memset( used,0,sizeof( used ) );
}

int main()
{
    int n,i,j,ans;

    while( cin>>n )
    {
        init();
        // for( i=0;i<n;i++ ) cin>>mp[i];
        for( i=0;i<n;i++ )
        {
            cin.get();
            for( j=0;j<n;j++ ) cin>>mp[i][j];
        }

        ans=0;
        for( i=0;i<n;i++ )
            for( j=0;j<n;j++ )
                if( used[i][j]==0 && mp[i][j]=='#' )
                {
                    flag=0;
                    dfs( i,j );
                    if( flag==0 ) ans++;
                }
        cout<<ans<<endl;
    }
    return 0;
}

--------> y
| 0 1 2 
| 1
| 2
>
x

int dx[4]={ -1,1,0,0 };     // 上下左右
int dy[4]={ 0,0,-1,1 };

int dx[4]={ 0,1,0,-1 };     // 东南西北
int dy[4]={ 1,0,-1,0 };

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/123663944