# Array# Simulation# Greedy

c165 - NOIP2015 2.扫雷游戏

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬掃雷遊戲,給定一個 n x m 的雷區地雷分布,計算每個非地雷格周圍的地雷數量,並輸出結果。地雷用 '*' 表示,非地雷格用周圍地雷的數量表示。

解題思路

本題的解題思路是模擬掃雷遊戲的規則。首先,建立一個與輸入雷區相同大小的二維陣列 ans,用於儲存每個格子的地雷數量。遍歷輸入雷區,如果遇到地雷,則將其周圍八個格子的地雷數量加一。最後,遍歷 ans 陣列,如果格子是地雷,則輸出 '*',否則輸出該格子的地雷數量。

複雜度分析

  • 時間複雜度: O(n*m)
  • 空間複雜度: O(n*m)

程式碼

#include <iostream>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int a,b;
	while(cin >> a >> b){
		char n;
		int ans[a][b];
		for(int i=0;i<a;i++){
			for(int j=0;j<b;j++){
				ans[i][j]=0;
			}
		}
		for(int i=0;i<a;i++){
			for(int j=0;j<b;j++){
				cin >> n;
				if(n=='*'){
					for(int ii=-1;ii<=1;ii++)
						for(int jj=-1;jj<=1;jj++)
							if(i+ii>=0&&i+ii<a&&j+jj>=0&&j+jj<b)
								ans[i+ii][j+jj]++;
					ans[i][j]-=10;
				}
			}
		}
		for(int i=0;i<a;i++){
			for(int j=0;j<b;j++){
				if(ans[i][j]>=0)
					cout << ans[i][j];
				else
					cout << "*";
			}
			cout << "\n";
		}
	}
}

Discussion