# DFS# Graph Traversal# Connected Components

c252 - 非洲內戰

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個非洲國家被劃分為多個派系,每個派系由一個數字代表。相鄰的相同派系可以組成一個政權。如果政權的數量大於最大派系的數量,則國家陷入混亂(輸出 "choas"),否則國家受到掌控(輸出 "peace")。

解題思路

本題可以使用深度優先搜尋 (DFS) 來找出每個政權的大小。首先,遍歷整個地圖,如果遇到未訪問的派系,則使用 DFS 遍歷所有與該派系相鄰且相同的區域,並計算該政權的大小。記錄所有政權的大小,以及不同派系的數量。最後,比較政權的數量和最大派系的數量,以確定國家是處於 "peace" 還是 "choas" 狀態。

複雜度分析

  • 時間複雜度: O(M * N),其中 M 和 N 分別是地圖的行數和列數。因為每個格子最多被訪問一次。
  • 空間複雜度: O(M * N),主要用於 has 陣列來記錄訪問過的格子,以及 DFS 的遞迴堆疊空間。在最壞情況下,整個地圖都是一個連通的政權,DFS 的深度可能達到 M * N。

程式碼

#include <iostream>
using namespace std;
int a[105][105],n,m,ct,ma,tmp;
char c;
bool has[105][105];
void dfs(int x,int y,int v){
	if(x>=n||y>=m||x<0||y<0||has[x][y]||a[x][y]!=v)return;
	has[x][y]=1;
	++tmp;
	for(int i=-1;i<=1;++i)
		for(int j=-1;j<=1;++j)
			dfs(x+i,y+j,v);
}
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	while(cin >> n >> m){
		if(n==0&&m==0)return 0;
		ct=ma=0;
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				cin >> c;
				a[i][j]=c-'0';
				has[i][j]=0;
			}
		}
		for(int i=0;i<n;++i)
			for(int j=0;j<m;++j)
				if(!has[i][j]&&a[i][j]){
					tmp=0;
					dfs(i,j,a[i][j]);
					ma=max(ma,tmp);
					++ct;
				}
		if(ct>ma){
			cout << "choas\n";
		}
		else{
			cout << "peace\n";
		}
	}
}

Discussion