其他分享
首页 > 其他分享> > 红烧鱼国王奇遇记

红烧鱼国王奇遇记

作者:互联网

【问题描述】

  输入第一行包含两个正整数M和N(1<N,M<30)表示人鱼王国的长和宽,下面是一个N行M列的二维数组,其中1表示陆地,0表示海水。输出: 一个整数a,表示陆地把海域分成的份数(斜着方向不算连通)。

【样例输入】

  5 5

  1 0 0 1 0

  0 1 0 0 1

  1 0 1 0 0

  1 0 0 1 1

  0 1 0 1 0

【样例输出】

  6

#include<iostream>
using namespace std;
int n, m, a[30][30]={};
// 上->右->下->左。 
int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};

void dfs(int x, int y){
    for(int i=0; i<=3; i++){
        int x1=x+dx[i];
        int y1=y+dy[i];
        // 判断遍历的条件。
        if(x1>=1&&x1<=m&&y1>=1&&y1<=n&&a[x1][y1]==0){
            a[x1][y1]=1;
            dfs(x1,y1);
        } 
    } 
    return;
}

int main(){
    int cnt=0;
    cin>>m>>n;
    for(int i=1; i<=m; i++){
        for(int j=1; j<=n; j++){
            cin>>a[i][j];
        }
    }
    // 不管是1还是0尽管搜索。
    for(int i=1; i<=m; i++){
        for(int j=1; j<=n; j++){
            if(a[i][j]==0){ // 如果为0,继续遍历,并且标记为1(连续遍历为0的地方)。 
                a[i][j]=1;
                dfs(i,j);
                cnt++;
            }
        }
    }
    cout<<cnt;
    return 0;
}

 

标签:奇遇记,int,30,样例,输入,&&,红烧鱼,国王
来源: https://www.cnblogs.com/dks0313/p/16535506.html