# Array# Simulation# Greedy# Counting

a867 - 7. Minelayer

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一個 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");
	}
}

Discussion