2019屆秋招——8.12字節跳動筆試之第一題

題目描述:

世界盃開幕式會在球場C舉行,球場C的球迷看臺可以容納M*N個球迷。在球場售票完場後,現官方想統計此次開幕式一共有多少個球隊球迷羣體,最最大的球隊球迷羣體有多少人。經調研發現,球迷羣體在選座時有一下特性:

  1. 同球隊的球迷羣體會選擇相鄰座位
  2. 不同球隊的球迷羣體會選擇不相鄰的座位。

註解:相鄰包括前後相鄰/左右相鄰/斜對角相鄰。
給定一個M*N的二維球場,0代表該位置沒有坐人,1代表該位置已有球迷,希望輸出球隊羣體個數P,最大的球隊羣體人數Q。
輸入描述:
第一行,2個數字,M和N,使用英文逗號分割;接下來M行,每行N的數字,使用英文逗號分割;
輸出描述:
一行,2個數字,P及Q,使用英文逗號分割;其中,P表示球隊羣體的個數,Q表示最大的球隊羣體人數

思路分析:
本題可以利用深度優先搜索來完成,然後利用遞歸方法來尋找同一個球隊的球迷,並且將已經訪問過的位置進行置“-1”,目的是不要重複搜索;


代碼如下所示:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;
//字符串分割函數
std::vector<std::string> split(std::string str, std::string pattern){
    std::string::size_type pos;
    std::vector<std::string> result;
    str += pattern;//擴展字符串以方便操作
    int size = str.size();
    for (int i = 0; i<size; i++){
        pos = str.find(pattern, i);
        if (pos<size){
            std::string s = str.substr(i, pos - i);
            result.push_back(s);
            i = pos + pattern.size() - 1;
        }
    }
    return result;
}

static int num = 0;//用於記錄同一球隊的觀衆的個數

static int DFS(vector<vector<int>>&matrix, int m, int n) {
    if (m < 0 || n < 0) return 0;
    if (m >= matrix.size() || n >= matrix[0].size()) return 0;
    if (matrix[m][n] == 1){
        matrix[m][n] = -1;
        num++;
    }
    else{
        return 0;
    }
    DFS(matrix, m + 1, n);
    DFS(matrix, m + 1, n + 1);
    DFS(matrix, m + 1, n - 1);
    DFS(matrix, m, n + 1);
    DFS(matrix, m, n - 1);
    DFS(matrix, m - 1, n - 1);
    DFS(matrix, m - 1, n);
    DFS(matrix, m - 1, n + 1);
    return num;
}

int main(int argc, char** argv){
    std::string str;
    int M, N;
    //int dx[] = {-1,-1,-1,0,0,1,1,1};
    //int dy[] = {-1,0,1,-1,1,-1,0,1};
    getline(std::cin, str);
    std::vector<std::string> result = split(str, ",");
    M = atoi(result[0].c_str());
    N = atoi(result[1].c_str());
    //cout << "M:" << M << " " << "N:" << N << endl;
    vector<vector<int>> matrix;
    vector<int> matrix_;
    string ss;
    for (int i = 0; i < M; i++) {
        getline(cin, ss);
        vector<string> temp = split(ss, ",");
        for (int j = 0; j < N; j++) {
            matrix_.push_back(atoi(temp[j].c_str()));
        }
        matrix.push_back(matrix_);
        matrix_.clear();
    }
    int number = 0;
    int max_per = 0;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            int x = DFS(matrix, i, j);
            if (x != 0){
                num = 0;
                number++;
            }
            max_per = max(x, max_per);
        }
    }
    cout << number << "," << max_per << endl;
    system("pause");
    return 0;
}

本地IDE結果如下所示:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章