1.《扫雷游戏》
题目描述 扫雷游戏是一款十分经典的单机小游戏。
在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷 格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字------ 提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷 格。
现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的 格子。 输入描述 输入的第一行是用一个空格隔开的两个整数 n 和 m,分别表示雷区的行数和列数。 接下来 nn 行,每行 mm 个字符,描述了雷区中的地雷分布情况。字符'*'表示相应格子是地雷格,字 符'?'表示相应格子是非地雷格。相邻字符之间无分隔符。
输出描述
输出包含 n 行,每行 m 个字符,描述整个雷区。用'*'表示地雷格,用周围的地雷个数表示非地雷 格。相邻字符之间无分隔符。
输入输出样例
示例 1
输入
3 3
3 3
*??
???
?*?
输出
*10
221
1*1
示例 2
输入
2 3
?*?
*??
输出
2*1
*21
思路:
利用两个二维数组,下标从1开始 ,进行八个方向的判断
a-1,b-1 | a,b-1 | a+1,b-1 |
a-1,b | a,b | a+1,b |
a-1,b+1 | a,b+1 | a+1,b+1 |
方法1:直接进行暴力搜索判断(数据量大的时候可能会超时)
代码:
int b[105][105]={ 0 };
int n,m;
void check(int i,int j){
if(i<1||i>n||j<1||j>m) return;
if(a[i-1][j-1]=='*') b[i][j]++;
if(a[i][j-1]=='*') b[i][j]++;
if(a[i+1][j-1]=='*') b[i][j]++;
if(a[i-1][j]=='*') b[i][j]++;
if(a[i+1][j]=='*') b[i][j]++;
if(a[i-1][j+1]=='*') b[i][j]++;
if(a[i][j+1]=='*') b[i][j]++;
if(a[i+1][j+1]=='*') b[i][j]++;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
check(i,j);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(a[i][j]=='*')
cout<<"*"<<" \n"[j==m];
else cout<<b[i][j]<<" \n"[j==m];
}
return 0;
}