题目描述
扫雷游戏你一定玩过吧!现在给你若干个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;
}
有人知道为什么吗???评论告诉我一下哦,谢谢啦!