JSK-16501 掃雷遊戲【謎題】
掃雷遊戲
掃雷遊戲是一款十分經典的單機小遊戲。在 n 行 m 列的雷區中有一些格子含有地雷(稱之為地雷格),其他格子不含地雷(稱之為非地雷格)。玩家翻開一個非地雷格時,該格將會出現一個數字——提示周圍格子中有多少個是地雷格。遊戲的目標是在不翻出任何地雷格的條件下,找出所有的非地雷格。
現在給出 n 行 m 列的雷區中的地雷分佈,要求計算出每個非地雷格周圍的地雷格數。
注:一個格子的周圍格子包括其上、下、左、右、左上、右上、左下、右下八個方向上與之直接相鄰的格子。
輸入格式
輸入第一行是用一個空格隔開的兩個整數 n 和 m,分別表示雷區的行數和列數(1≤n,m≤100)。
接下來 n 行,每行 m 個字元,描述了雷區中的地雷分佈情況。字元* 表示相應格子是地雷格,字元 ? 表示相應格子是非地雷格。相鄰字元之間無分隔符。
輸出格式
輸出包含 n 行,每行 m 個字元,描述整個雷區。用 * 表示地雷格,用周圍的地雷個數表示非地雷格。相鄰字元之間無分隔符。
資料規模與約定
對於 100% 的資料,1≤n≤100,1≤m≤100。
輸出時每行末尾的多餘空格,不影響答案正確性
樣例輸入1
3 3
??
???
?
樣例輸出1
10
221
11
樣例輸入2
2 3
?*?
??
樣例輸出2
21
*21
題目來源
NOIP 2015 普及組
問題連結: JSK-16501 掃雷遊戲
問題分析:
掃雷遊戲是人們熟知的一個計算機遊戲,通過這個程式,可以瞭解其區域性的計算是如何實現的。
這是一個簡單的計算問題,對於一個位置,直接計算其周圍的地雷數量即可。
定義二維陣列用於儲存掃雷遊戲的棋盤時,周圍多出一圈,可以省去陣列下標的越界判定。
程式說明:
函式memset()用於給大量的儲存空間設定初始值是方便快捷的。
陣列around[]儲存周圍元素的相對下標,使得無序變有序,可以用迴圈來處理。
這個是程式是之前寫過的,這次CV過來簡單改了一下,參見參考連結。
題記
參考連結:Vijos P1975 掃雷遊戲【謎題】
AC的C語言程式如下:
/* JSK-16501 掃雷遊戲 */
#include <stdio.h>
#include <string.h>
#define D 8
int drow[] = {-1, -1, -1, 0, 1, 1, 1};
int dcol[] = {-1, 0, 1, 1, 1, 0, -1, -1};
#define N 100
char a[N+2][N+2];
int main(void)
{
int n, m, i, j, k;
memset(a, 0, sizeof (a));
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
scanf("%s", a[i]+1);
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
int count = 0;
if(a[i][j] == '*')
printf("%c", a[i][j]);
else {
for(k = 0; k < D; k++)
if(a[i + drow[k]][j + dcol[k]] == '*')
count++;
printf("%d", count);
}
}
printf("\n");
}
return 0;
}