2018年阿里秋招在线笔试题——求冰田区域

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lishang6257/article/details/79745419

目录


问题描述

将一个区域,分成 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. 简单题,只需要判断右面,上面,右上面,左上面是否有冰即可

代码实现

IDE : vs code
编译器:MinGW
语言 :C++


#include <iostream>
#define maxLen 100

using namespace std;

int main()
{
    int m,n;
    char a[maxLen][maxLen];
    while(cin >> m >> n && m && n){
        for(int i = 0;i < m;i ++){
            for(int j = 0;j < n;j ++)
                cin >> a[i][j];
        }
        int b[maxLen][maxLen] = {0},id = 1;
        for(int i = 0;i < m;i ++){
            for(int j = 0;j < n;j ++){
                if(a[i][j] == '*'){
                    if(j != 0 && a[i][j-1] == '*') //有左方元素
                        b[i][j] = b[i][j-1];
                    else if(i != 0 && a[i-1][j] == '*') //有上方元素
                        b[i][j] = b[i - 1][j];
                    else if(i != 0 && j != 0 && a[i-1][j-1] == '*')//左上
                        b[i][j] = b[i-1][j-1];
                    else if(i != 0 && j != n-1 && a[i-1][j+1] == '*')//右上
                        b[i][j] = b[i-1][j+1];
                    else
                        b[i][j] = id ++;
                }
            }
        }
        cout << id - 1 << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lishang6257/article/details/79745419
今日推荐