# DFS# Recursion# Array# Simulation

f928 - 連環炸彈.................Boom!

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個炸彈連環爆炸的過程。給定一串炸彈的類型,以及一個起始引爆點,模擬炸彈爆炸的過程,並輸出最終炸彈的狀態。炸彈類型分為啞炮(1)、左右炮(2)和怪怪炮(k >= 3),它們的爆炸範圍不同。

解題思路

本題可以使用深度優先搜尋 (DFS) 來模擬炸彈爆炸的連環反應。從起始炸彈開始,根據其類型引爆周圍的炸彈,並重複此過程直到沒有新的炸彈可以引爆。在引爆炸彈時,將其狀態設為 0。需要注意邊界條件,避免訪問陣列越界。

複雜度分析

  • 時間複雜度: O(N^2),在最壞情況下,每個炸彈都可能引爆其他炸彈,導致需要遍歷整個陣列多次。
  • 空間複雜度: O(N),主要用於遞迴調用的堆疊空間,在最壞情況下,遞迴深度可能達到 N。

程式碼

#include <iostream>
using namespace std;
int n,a[1005],s;
void dfs(int it){
	if(it<0||it>=n||a[it]==0)return;
	int t=a[it];
	a[it]=0;
	if(t==2){
		dfs(it+1);
		dfs(it-1);
	}
	else if(t>2){
		dfs(it+2*t);
		dfs(it-2*t);
		dfs(it+t);
		dfs(it-t);
	}
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	for(int i=0;i<n;++i){
		cin >> a[i];
	}
	cin >> s;
	dfs(s);
	for(int i=0;i<n;++i){
		cout << a[i] << " ";
	}
}

Discussion