1. 程式人生 > >2018年阿里秋招線上筆試題——求冰田區域

2018年阿里秋招線上筆試題——求冰田區域

目錄

文章目錄

問題描述

\qquad將一個區域,分成 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; }