?
蓝桥杯备赛 | 洛谷做题打卡day2
题目来源:洛谷P2670 [NOIP2015 普及组] 扫雷游戏
NOIP2015 普及组 T2
扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出 n n n 行 m m m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
第一行是用一个空格隔开的两个整数 n n n 和 m m m,分别表示雷区的行数和列数。
接下来 n n n 行,每行 m m m 个字符,描述了雷区中的地雷分布情况。字符 * \texttt{*} * 表示相应格子是地雷格,字符 ? \texttt{?} ? 表示相应格子是非地雷格。相邻字符之间无分隔符。
输出文件包含 n n n 行,每行 m m m 个字符,描述整个雷区。用 * \texttt{*} * 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
3 3
*??
???
?*?
*10
221
1*1
2 3
?*?
*??
2*1
*21
对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 100 , 1 ≤ m ≤ 100 1≤n≤100, 1≤m≤100 1≤n≤100,1≤m≤100。
利用嵌套循环,自己多试试,debug,以下是我的代码~
#include<iostream>
using namespace std;
char s[110][110];
int t = 0;
void find(int a, int b)
{
if (s[a][b] == '*') t++;
}
int main()
{
int n, m, cnt = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> s[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (s[i][j] == '*') cout << '*';
if (s[i][j] == '?')
{
for (int p = i - 1; p <= i + 1; p++)
{
for (int q = j - 1; q <= j + 1; q++) find(p, q);
}
cout << t;
t = 0;
}
}
cout << endl;
}
return 0;
}
我的一些话
?很多前辈的题解都很长且包括诸如s[i-1][j-1]一直到s[i+1][j+1]这般冗长的搜索,其实…我觉得直接用循环就好了嘛
两次debug然后AC,嵌套了find函数看起来会稍微简洁一些,其实这题思路不难的——不外乎将字符装进数组,嵌套循环换行,然后分遇‘*’直接输出 ,遇‘?’搜索输出数字两种情况,然后就没有然后了,华丽收场~
欢迎关注我,每日更新蓝桥杯备赛好题 and C++学习日记一起成长:)