[蓝桥杯][算法提高VIP]扫雷-枚举

题目描述
扫雷游戏你一定玩过吧!现在给你若干个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;
}

有人知道为什么吗???评论告诉我一下哦,谢谢啦!

猜你喜欢

转载自blog.csdn.net/m0_51955470/article/details/115409169