扫雷(c++题解)

news/2024/6/18 21:27:24 标签: 开发语言, 算法

题目描述

题目描述

扫雷是一种计算机游戏,在  世纪  年代开始流行,并且仍然包含在某些版本的 Microsoft Windows 操作系统中。

在这个问题中,你正在一个矩形网格上玩扫雷游戏。

最初网格内的所有单元格都呈未打开状态。

其中  个不同的单元格中隐藏着  个地雷。

其他单元格内不包含地雷。

你可以单击任何单元格将其打开。

如果你点击到的单元格中包含一个地雷,那么游戏就会判定失败。

如果你点击到的单元格内不含地雷,则单元格内将显示一个  到  之间的数字(包括  和 ),这对应于该单元格的所有相邻单元格中包含地雷的单元格的数量。

如果两个单元格共享一个角或边,则它们是相邻单元格。

另外,如果某个单元格被打开时显示数字 ,那么它的所有相邻单元格也会以递归方式自动打开。

当所有不含地雷的单元格都被打开时,游戏就会判定胜利。

例如,网格的初始状态可能如下所示(* 表示地雷,而 c 表示第一个点击的单元格):

复制*..*...**.
....*.....
..c..*....
........*.
..........

被点击的单元格旁边没有地雷,因此当它被打开时显示数字 ,并且它的  个相邻单元也被自动打开,此过程不断继续,最终状态如下:

复制*..*...**.
1112*.....
00012*....
00001111*.
00000001..

此时,仍有不包含地雷的单元格(用 . 字符表示)未被打开,因此玩家必须继续点击未打开的单元格,使游戏继续进行。

你想尽快赢得游戏胜利并希望找到赢得游戏的最低点击次数。

给定网格的尺寸(),输出能够获胜的最小点击次数。

输入格式

第一行包含整数 ,表示共有  组测试数据。

每组数据第一行包含整数 ,表示游戏网格的尺寸大小。

接下来  行,每行包含一个长度为  的字符串,字符串由 .(无雷)和 *(有雷)构成,表示游戏网格的初始状态。

输出格式

每组数据输出一个结果,每个结果占一行。

结果表示为 Case #x: y,其中  是组别编号(从  开始), 是获胜所需的最小点击次数。

数据范围

输入样例:
复制2
3
..*
..*
**.
5
..*..
..*..
.*..*
.*...
.*...
输出样例:
复制Case #1: 2
Case #2: 8

_____________________________________________________________________________

写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

_____________________________________________________________________________

#include <bits/stdc++.h>
using namespace std;
int T;
int n;
int ans = 0;
int a[305][305];
bool vis[305][305];
int dir[8][2] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 } };
void bfs(int x, int y) {
    queue<pair<int, int> > q;
    q.push({ x, y });
    vis[x][y] = true;
    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        for (int i = 0; i < 8; i++) {
            int dx = t.first + dir[i][0], dy = t.second + dir[i][1];
            if (dx < 1 || dx > n || dy < 1 || dy > n || a[dx][dy] < 0 || vis[dx][dy])
                continue;
            if (a[dx][dy] == 0) {
                vis[dx][dy] = 1;
                q.push({ dx, dy });
            } else {
                vis[dx][dy] = 1;
            }
        }
    }
}
int main() {
    cin >> T;
    for (int i = 1; i <= T; i++) {
        ans = 0;
        memset(vis, 0, sizeof(vis));
        memset(a, 0, sizeof(a));
        cin >> n;
        for (int j = 1; j <= n; j++) {
            for (int k = 1; k <= n; k++) {
                char t;
                cin >> t;
                if (t == '*') {
                    a[j][k] = -INT_MAX;
                    a[j - 1][k - 1]++, a[j - 1][k]++, a[j - 1][k + 1]++, a[j][k - 1]++, a[j][k + 1]++,
                        a[j + 1][k - 1]++, a[j + 1][k]++, a[j + 1][k + 1]++;
                }
            }
        }
        for (int k = 1; k <= n; k++) {
            for (int j = 1; j <= n; j++) {
                if (a[k][j] == 0 && vis[k][j] != 1) {
                    bfs(k, j);
                    ans++;
                }
            }
        }
        for (int k = 1; k <= n; k++) {
            for (int j = 1; j <= n; j++) {
                if (a[k][j] < 0 || vis[k][j])
                    continue;
                ans++;
            }
        }
        cout << "Case #" << i << ": " << ans << endl;
    }
}


http://www.niftyadmin.cn/n/5448279.html

相关文章

网络层(IP层)

IP协议的本质&#xff1a;有将数据跨网络传输的能力 而用户需要的是将数据从主机A到主机B可靠地跨网络传输 IP的组成&#xff1a;目标网络目标主机 IP由目标网络和目标主机两部分组成&#xff0c;IP报文要进行传输&#xff0c;要先到达目标网络&#xff0c;然后经过路由器转到…

IPV6报文详解

目录 前言&#xff1a; IPV6报文格式 IPV6基本报头 IPV6扩展报头 前言&#xff1a; 首先IPV6是属于网络层的一种协议&#xff0c;作为下一代IP协议&#xff0c;而想要学习一种协议就必不可少的需要去具体的研究协议报文中的各个参数以及其对应的功能作用。 IPV6报文格式 I…

卷积篇 | YOLOv8改进之主干网络中引入可变形卷积DConv

前言:Hello大家好,我是小哥谈。可变形卷积模块是一种改进的卷积操作,它可以更好地适应物体的形状和尺寸,提高模型的鲁棒性。可变形卷积模块的实现方式是在标准卷积操作中增加一个偏移量offset,使卷积核能够在训练过程中扩展到更大的范围,从而实现对尺度、长宽比和旋转等各…

mineadmin前端安装启动

在上一篇文章中&#xff0c; 我们已经搭建好了后端环境并启动 mineadmin 快速安装部署&#xff08;docker环境&#xff09; 一、下载前端项目 1、在搭建后端时候&#xff0c;使用php bin/hyperf.php mine:install 的时候&#xff0c;有一个步骤是安装前端项目的。安装目录为&a…

【Python从入门到进阶】51、电影天堂网站多页面下载实战

接上篇《50、当当网Scrapy项目实战&#xff08;三&#xff09;》 上一篇我们讲解了使用Scrapy框架在当当网抓取多页书籍数据的效果&#xff0c;本篇我们来抓取电影天堂网站的数据&#xff0c;同样采用Scrapy框架多页面下载的模式来实现。 一、抓取需求 打开电影天堂网站&…

vue3+threejs新手从零开发卡牌游戏(九):添加抽卡逻辑和动效

首先优化下之前的代码&#xff0c;把game/deck/p1.vue中修改卡组方法和渲染卡组文字方法提到公共方法中&#xff0c;此时utils/common.ts完整代码如下&#xff1a; import { nextTick } from vue; import * as THREE from three; import * as TWEEN from tweenjs/tween.js impo…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中&#xff0c;通常有许多相关的特征&#xff0c;但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时&#xff0c;确实可以利用该变量可见或可观察的实例&#xff0c;以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

2024.3.24每日一题

LeetCode 零钱兑换 题目链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币…