题目描述
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0<
n,m< =100

(注意两个矩阵之间应该有一个空行,由于oj的格式化这里不能显示出来)

输入

输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用’*'表示。当n=m=0时输入结束。

数据规模和约定
0< n,m< =100

输出
对于第i个矩阵,首先在单独的一行里打印序号:“Field
#i:”,接下来的n行中,读入的’.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
样例输入 4 4 *... .... .*.. .... 3 5 **... ..... .*... 0 0 样例输出 Field #1: *100 2210
1*10 1110 Field #2: **100 33200 1*100
解题思路:
水题!!!但不知道为什么要考虑边界,感觉不考虑边界也对啊!

AC代码如下:
#include <iostream> using namespace std; const int N = 110; int n, m; char g[N]
[N]; char a[N][N]; int main() { int count = 0; while (cin >> n >> m, n, m) {
count++; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> g[i][j
]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { if (g[i][j] ==
'*') a[i][j] = '*'; else if (g[i][j] == '.') { int cnt = 0; if ( i + 1 <= n && j
<= m && g[i + 1][j] == '*') cnt++; if (i + 1 <= n && j + 1 <= m && g[i + 1][j +
1] == '*') cnt++; if (i + 1 <= n && j - 1 >= 1 && g[i + 1][j - 1] == '*') cnt++;
if (i - 1 >= 1 && j <= m && g[i - 1][j] == '*') cnt++; if (i - 1 >= 1 && j + 1
<= m && g[i - 1][j + 1] == '*') cnt++; if (i - 1 >= 1 && j - 1 >= 1 && g[i - 1][
j- 1] == '*') cnt++; if (i <= n && j + 1 <= m && g[i][j + 1] == '*') cnt++; if (
i<= n && j - 1 >= 1 && g[i][j - 1] == '*') cnt++; a[i][j] = cnt + '0'; } } cout
<< "Field #" << count << ": " << endl; for (int i = 1; i <= n; i++) { for (int j
= 1; j <= m; j++) { cout << a[i][j]; } cout << endl; } cout << endl; } return 0;
}
我感觉这道题不考虑边界也对,但是不知道为什么ac不了,只能拿60分,代码如下:
#include <iostream> using namespace std; const int N = 110; int n, m; char g[N]
[N]; char a[N][N]; int main() { int count = 0; while (cin >> n >> m, n, m) { for
(int i = 0; i <= n + 1; i++) for (int j = 0; j <= m + 1; j++) g[i][j] == '.';
count++; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> g[i][j
]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { if (g[i][j] ==
'*') a[i][j] = '*'; else if (g[i][j] == '.') { int cnt = 0; if (g[i + 1][j] ==
'*') cnt++; if (g[i + 1][j + 1] == '*') cnt++; if (g[i + 1][j - 1] == '*') cnt++
; if (g[i - 1][j] == '*') cnt++; if (g[i - 1][j + 1] == '*') cnt++; if (g[i - 1]
[j - 1] == '*') cnt++; if (g[i][j + 1] == '*') cnt++; if (g[i][j - 1] == '*')
cnt++; a[i][j] = cnt + '0'; } } cout << "Field #" << count << ": " << endl; for
(int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cout << a[i][j]; }
cout<< endl; } cout << endl; } return 0; }
有人知道为什么吗???评论告诉我一下哦,谢谢啦!

技术
©2019-2020 Toolsou All rights reserved,
css中上下左右居中的几种实现方法[CISCN 2019 初赛]Love Mathc/c++语言实现登陆界面Unity3D 人称设置(第一人称视角、第三人称视角)Fastadmin框架自定义搜索操作流程2021最新Python自动化软件测试笔试题(含答案)黑客帝国装逼的代码雨mysql数据库设置字符集配置修改my.ini文件(windows)python之panda模块1Python学习笔记:基础+进阶10道练习题