#54913: C解法參考(附帶註解


fred1090037@gmail.com (Fred)


這題要注意已經爆過的炸彈不要再引爆了,不然會無限循環


#include <stdio.h>
 
int bomb[1001];   // 全域陣列,儲存所有炸彈狀態
 
// 遞迴函式:模擬從第 i 個炸彈開始的連鎖爆炸
void Detonate(int bomb[],int i,int N);
 
int main()
{
int N;
int first_detonate;       // 初始引爆位置
int i;
 
scanf("%d",&N);           // 輸入炸彈數量
 
// 輸入每個炸彈的類型
for(i=0; i<N; i++) {
scanf("%d",&bomb[i]);
}
 
scanf("%d",&first_detonate);   // 輸入起始引爆位置
 
// 從指定位置開始爆炸
Detonate(bomb,first_detonate,N);
 
// 輸出最終結果
for(i=0; i<N; i++) {
printf("%d ",bomb[i]);
}
 
return 0;
}
 
// 遞迴處理爆炸
void Detonate(int bomb[],int i, int N) {
 
    int temp;
 
// 如果該炸彈還沒被引爆(不為 0)
if(bomb[i]!=0) {
 
temp=bomb[i];   // 先記住原本的爆炸類型
bomb[i]=0;      // 標記為已爆炸(避免重複觸發)
 
// 類型 2:影響左右相鄰炸彈
if(temp==2) {
   
if(i-1>=0) {
Detonate(bomb,i-1,N);   // 引爆左邊
}
 
if(i+1<=N-1) {
Detonate(bomb,i+1,N);   // 引爆右邊
}
}
 
// 類型 >=3:影響 ±temp、±2*temp
if(temp>=3) {
 
if(i-temp>=0) {
Detonate(bomb,i-temp,N);
}
if(i-2*temp>=0) {
Detonate(bomb,i-2*temp,N);
}
if(i+temp<=N-1) {
Detonate(bomb,i+temp,N);
}
if(i+2*temp<=N-1) {
Detonate(bomb,i+2*temp,N);
}
}
}
}