a867 - 7. Minelayer
題目描述
題目要求讀取一個 15x30 的地雷盤,其中 * 代表地雷,. 代表安全區域。對於每個安全區域,計算其周圍八個方向(包括自身)的地雷數量,並將結果輸出。如果一個格子是地雷,則輸出 *。如果一個安全格子周圍沒有地雷,則輸出 .。否則,輸出周圍地雷的數量。
解題思路
這題的解題思路是先讀取地雷盤,然後遍歷整個盤面。對於每個格子,如果它是地雷,則將其標記為 -10 (方便後續判斷)。如果它是安全格子,則遍歷其周圍八個格子,統計地雷的數量,並將數量存儲在對應的格子中。最後,遍歷整個盤面,根據標記的數值輸出結果。
複雜度分析
- 時間複雜度: O(15 * 30 * 9) = O(1) 因為盤面大小固定。
- 空間複雜度: O(15 * 30) = O(1) 因為需要一個與輸入盤面大小相同的陣列來存儲結果。
程式碼
#include <stdio.h>
char b[15][30];
int c[15][30];
int main(){
for(int i=0;i<15;i++){
for(int j=0;j<=30;j++){
scanf("%c",&b[i][j]);
c[i][j]=0;
}
}
for(int i=0;i<15;i++){
for(int j=0;j<30;j++){
if(b[i][j]=='*'){
for(int x=-1;x<=1;x++){
for(int y=-1;y<=1;y++){
if(i+x>=0&&i+x<15&&j+y>=0&&j+y<30)
c[i+x][j+y]++;
}
}
c[i][j]=-10;
}
}
}
for(int i=0;i<15;i++){
for(int j=0;j<30;j++){
if(c[i][j]<0)printf("*");
else if(c[i][j]==0)printf(".");
else printf("%d",c[i][j]);
}
printf("\n");
}
}