NOIP2015 普及組第二題 掃雷遊戲(mine.cpp)

瘋狂的函數 2022-01-07 20:34:00 阅读数:177

noip2015 noip 普及 第二 mine.cpp

題目描述

掃雷遊戲是一款十分經典的單機小遊戲。
在n行m列的雷區中有一些格子含有地雷(稱之為地雷格),其他格子不含地雷(稱之為非地雷格)。
玩家翻開一個非地雷格時,該格將會出現一個數字——提示周圍格子中有多少個是地雷格。
遊戲的目標是在不翻出任何地雷格的條件下,找出所有的非地雷格。

現在給出n行m列的雷區中的地雷分布,要求計算出每個非地雷格周圍的地雷格數。

注:一個格子的周圍格子包括其上、下、左、右、左上、左下、右上、右下八個方向上與之直接相鄰的格子。

輸入

輸入文件名為mine.in

第一行用一個空格隔開的兩個整數n和m,分別錶示雷區的行數和列數。

接下來n行,每行m個字符,描述了雷區中的地雷分布情况。字符∗*∗'錶示相應的格子是地雷格,字符`???錶示相應的格子是非地雷格子。相鄰字符之間無分隔符。

輸出

輸出文件名為mine.out

包括n行,每行m個字符,描述了整個雷區。用∗*∗錶示地雷格,用周圍地雷格數錶示非地雷格。相鄰字符之間無分隔符。

樣例輸入

樣例輸入1
3 3
*??
???
?*?
樣例輸入2
2 3
?*?
*??

樣例輸出

樣例輸出1
*10
221
1*1
樣例輸出2
2*1
*21

提示

對於所有的數據,1≤n≤100, 1≤m≤1001\le n\le 100,~1\le m\le 1001≤n≤100, 1≤m≤100。

程序實現

#include<bits/stdc++.h>
using namespace std;
int bs[8][2]={1,1,1,0,1,-1,0,1,0,-1,-1,1,-1,0,-1,-1};
int main()
{
int n,m;
cin>>n>>m;
char a[n][m];
int b[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
b[i][j]=0;
if(a[i][j]=='*'){
b[i][j]=-1;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]!=-1){
for(int k=0;k<8;k++){
int x=i+bs[k][0];
int y=j+bs[k][1];
if(x>=0&&x<n&&y>=0&&y<m){
if(b[x][y]==-1){
b[i][j]++;
}
}
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i][j]==-1){
cout<<"*";
}
else{
cout<<b[i][j];
}
}
cout<<endl;
}
return 0;
}

版权声明:本文为[瘋狂的函數]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072034000591.html