算法题(二)扫雷游戏

1.概述

扫雷游戏是一款十分经典的电脑单机游戏,在雷区里,雷区是由n行m列的网格组成,这些网格又分为地雷区和非地雷区。地雷区是由一个地雷组成,非地雷区会有一个数字,代表周围八个格子中的地雷数。要求计算出非地雷区的数字。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方。

输入格式:
输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。

接下来n行,每行m个字符,描述了雷区中的地雷分布情况。‘*’代表为地雷区,‘?’表示为非地雷区。

1≤n≤100,1≤m≤100

输出格式:
输出文件包含n行,每行m个字符,描述整个雷区。用字符’*’表示地雷区,将非雷区用数字表示。

2.样例

请添加图片描述

3.代码及其思路

(1)dfs(深度搜索)

通过一个二维字符数组存储这个?与*,然后检测出*后,略过,非雷区先标记为0,

随后通过一个二维数组存储题中要求的8个方向,随后利用一个for循环对这8个方向进行判断。

最后利用字符数组输出

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	char a[102][102];
	//该数组用来进行查找等
	int map[102][102];
	//该数组用来记取非地雷区的数字
	int nxt[8][2] = { {0,1},{1,1},{1,0},{1,-1},{0,-1}, {-1,-1}, {-1,0}, {-1,1} };
	//下,右下,右,右上,上,左上,左,左下
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			map[i][j] = 0;
		}
	}//初始化数组
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}//遍历字符数组输入
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '*') {
				continue;//不管'*',继续遍历
			}
				for (int k = 0; k < 8; k++) {
					int dx = i + nxt[k][0];
					int dy = j + nxt[k][1];
					//8个方向均找一遍
					if (dx >= 0 && dy >= 0 && dx < n && dy < m&&a[dx][dy]=='*') {
					//防止数组溢出,例如在矩阵四周的位置要查找8个方向,会有一些方向是没有元素的
					//所以应该满足其查找的位置在这个n行m列的矩阵里面
						map[i][j]++;//找到后,其计数+1;
					}
				}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '*') {
				cout << "*";
				continue;
			}//每次遇到'*',输出,并使其进入下一个循环
			cout<< map[i][j];//不遇到'*',输出map存储的非地雷区八个方向雷的个数
		}
		cout << endl;//换行
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c语言15天菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值