阿里秋招笔试题——求冰田区域

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/weixin_41969587,未经博主允许不得转载。 https://blog.csdn.net/weixin_41969587/article/details/82723593

问题描述

将一个区域,分成 m×n 个块,若某一个块有冰则用 * 表示,无冰则用 0 表示,任给一个这样的区域,求冰田区域(冰田区域划分规则:如果两个小块之间能够在不穿越其他块的情况下连成直线,则**属于同一冰田区块)个数?

  • 输入


    这里写图片描述

  • 输出

    冰块数

样例输入输出

输入
4 4
* 0 0 0
0 0 0 0
0 0 * 0
0 0 0 *
4 6
0 0 0 0 0 0
0 0 * 0 0 *
0 0 * * 0 0
0 0 0 * 0 *
输出

2
3

问题分析

  1. 首先遍历到 * 的点,冰块数+1,并且该 * 点连起来的冰块区域 * 点全部变为 0
  2. 遍历完所有的点即可,输出冰块数

代码实现

#include<iostream>
using namespace std;
const int MaxSize=1000;
class MGraph{//构建图 
    public:
    MGraph(int n,int m);
    char adj[MaxSize][MaxSize];
};
MGraph::MGraph(int n,int m){//初始化 
    for(int i=0;i<=n;i++)//第一列全部置为0 
    adj[i][0]='0';
    for(int i=0;i<=m;i++)//第一行全部置为0 
    adj[0][i]='0';
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    cin>>adj[i][j];//输入节点 
}
void DFS(MGraph &G,int i,int j){//深度遍历,把*的所有连在一起的点全部变为0
    int ti=i+1,tj=j+1;
    int ki=i-1,kj=j-1;
    for(int b=ki;b<=ti;b++)//把该点的八个方向和自身都遍历 
    for(int c=kj;c<=tj;c++){//遇到是*的全部变为0 
        if(G.adj[b][c]=='*')
        {
        G.adj[b][c]='0';
        DFS(G,b,c);
    }
  }
}
int main(){
    int n,m,num;
    while(1){
    num=0;
    cin>>n>>m;
    MGraph G(n,m);//创建图 
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
        if(G.adj[i][j]=='*'){
            num++;//第一次遇到*,num++ 
            DFS(G,i,j);//把该*点的全部邻接点变为0 
        }//继续的遍历 
    }
    cout<<num<<endl;
   }
    return 0;
}

代码如有错误,欢迎大家指点出来!

猜你喜欢

转载自blog.csdn.net/weixin_41969587/article/details/82723593