題目描述:
世界盃開幕式會在球場C舉行,球場C的球迷看臺可以容納M*N個球迷。在球場售票完場後,現官方想統計此次開幕式一共有多少個球隊球迷羣體,最最大的球隊球迷羣體有多少人。經調研發現,球迷羣體在選座時有一下特性:
- 同球隊的球迷羣體會選擇相鄰座位
- 不同球隊的球迷羣體會選擇不相鄰的座位。
註解:相鄰包括前後相鄰/左右相鄰/斜對角相鄰。
給定一個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結果如下所示: