菜学C++ Day59 OJ题目1580扫雷(mine)

我也不知道为什么我的vs打不开这个头文件

 官方解法:它是按照从a[1][1]开始输入字符,并且划分到110,所以当i-1和j-1的时候是有开创了空间的数组了的,由于判断语句是*,所以原本的0是不相匹配的。

我的解法:我本来也是想穷举那八个,而且还是把数组外围变成两行两列加四个角,相当于8个情况加中间的一起穷举,可是写着写着感觉太麻烦了,然后发现可以for循环那8个位置呀,当不满足的时候就跳过继续嘛,这不就是continue语句吗!然后就利用这样列出来了

#include<iostream>
using namespace std;

#define N 100
#define M 100

//输入地雷分布
void f(int n,int m,char a[N][M]) {
	for(int i=0;i<n;i++)
		for (int j = 0; j < m; j++) {
			char x;
			cin >> x;
			a[i][j] = x;
		}
}
//寻找非地雷区周围的地雷数量
int s(int n, int m, int i,int j,char a[N][M]) {
	int k = 0;
	for (int x = i - 1; x <= i + 1; x++) {
		if (x == -1 || x == n)continue;
		for (int y = j - 1; y <= j + 1; y++) {
			if (y == -1 || y ==m)continue;
			if (a[x][y] == '*')k++;
		}		
	}
	return k;
}

int main() {
	int n, m;
	cin >> n >> m;
	char a[N][M] = {};
	f(n, m, a);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '?')cout << s(n, m, i, j, a);
			else cout << '*';
		}
		cout << "\n";
	}
	return 0;
}

这是本来的穷举情况,并没有列举完

//两行两列四个角
	if (i == 0 && j != 0 && j != m - 1) {
		if (a[i][j-1] == '*')k++;
		if (a[i][j+1] == '*')k++;
		if (a[i+1][j-1] == '*')k++;
		if (a[i+1][j] == '*')k++;
		if (a[i+1][j+1] == '*')k++;
	}
	if (i == n-1 && j != 0 && j != m - 1) {
		if (a[i][j - 1] == '*')k++;
		if (a[i][j + 1] == '*')k++;
		if (a[i - 1][j - 1] == '*')k++;
		if (a[i - 1][j] == '*')k++;
		if (a[i - 1][j + 1] == '*')k++;
	}
	if (j == 0 && i != 0 && i != n - 1) {
		if (a[i-1][j] == '*')k++;
		if (a[i+1][j] == '*')k++;
		if (a[i - 1][j + 1] == '*')k++;
		if (a[i][j+1] == '*')k++;
		if (a[i + 1][j + 1] == '*')k++;
	}
	if (j == m-1 && i != 0 && i != n - 1) {
		if (a[i - 1][j] == '*')k++;
		if (a[i + 1][j] == '*')k++;
		if (a[i - 1][j - 1] == '*')k++;
		if (a[i][j - 1] == '*')k++;
		if (a[i + 1][j - 1] == '*')k++;
	}
	if (i == 0 && j == 0) {
		if (a[i][j + 1] == '*')k++;
		if (a[i+1][j] == '*')k++;
		if (a[i+1][j + 1] == '*')k++;
	}
	if (i == 0 && j == m-1) {
		if (a[i][j + 1] == '*')k++;
		if (a[i + 1][j] == '*')k++;
		if (a[i + 1][j + 1] == '*')k++;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值