【题目描述】
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
【输入描述】
第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*
’表示相应格子是地雷格,字符’?
’表示相应格子是非地雷格。相邻字符之间无分隔符。
【输出描述】
包含n行,每行m个字符,描述整个雷区。用’*
’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
【样例输入1】
3 3 *?? ??? ?*?
【样例输出1】
*10 221 1*1
【样例输入2】
2 3 ?*? *??
【样例输出2】
2*1 *21
【数据规模】
对于 100%的数据, 1≤n≤100,1≤m≤100
【分析】
1.题目数据范围不大,暴力搜索即可
2.数组不要越界
3. 一个思路是可以不用字符数组去判断,把题目中的字符数组转换成 0 和1
【思路1】
将输入的字符转换成数字,直接进行双重for循环遍历暴搜即可。
【参考代码1】
#include<bits/stdc++.h> using namespace std; bool a[105][105];//一张地图,有雷为一,无雷为零 int main() { memset(a,0,sizeof(a));//地图最开始清空 int n,m; char tmp; cin>>n>>m; for(int i=1;i<=n;i++)//读入地图 { for(int j=1;j<=m;j++) { cin>>tmp;//读入每一个点 if(tmp=='*') a[i][j]=1;//如果是地雷就将这个点设为一 } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]==1) printf("*"); //如果是地雷不用输出数字 else { printf("%d",a[i+1][j+1]+a[i+1][j-1]+a[i+1][j]+a[i][j+1]+a[i][j-1]+a[i-1][j+1]+a[i-1][j]+a[i-1][j-1]); //将旁边的雷加起来输出 } } printf("\n"); } return 0;//愉快的结束了主程序 }
返回目录:NOIP/CSP信息学奥赛复赛