【题解】[NOIP2015]扫雷游戏(Java C++)

news2024/11/30 10:36:44

题目描述

见 P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷。

前置知识

无。

题目分析

只需要统计每一个格子周围 8 个格子的地雷数量即可。

重点是处理边界情况,比如左上角,有五个格子不在数组范围内,需要特殊处理。
示意图

为了避免思路混乱,可以考虑单独开写一个函数来判断某个格子是否有地雷。

参考代码

Java:

import java.util.*;

public class Main {
    private static boolean[][] mines;
    private static int n, m; // n=行,m=列
    
    public static void main(String[] args) {
        // 输入
        Scanner s = new Scanner(System.in);
        n = s.nextInt();
        m = s.nextInt();
        s.nextLine();
        mines = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            String line = s.nextLine();
            char[] tokens = line.toCharArray();
            for (int j = 0; j < m; j++) {
                mines[i][j] = (tokens[j] == '*');
            }
        }
        
        // 计算
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int count = getCount(i ,j);
                if (count == -1)
                	System.out.print("*");
                else
                	System.out.print(count);
            }
            System.out.println();
        }
        
    }
    
    private static int getCount(int row, int col) {
        // 是地雷
        if (mines[row][col])
            return -1;
        
        // 不是地雷
        int count = 0;
        count += hasMine(row-1, col-1);
        count += hasMine(row-1, col);
        count += hasMine(row-1, col+1);
        
        count += hasMine(row, col-1);
        count += hasMine(row, col);
        count += hasMine(row, col+1);
        
        count += hasMine(row+1, col-1);
        count += hasMine(row+1, col);
        count += hasMine(row+1, col+1);
        
        return count;
    }
    
    private static int hasMine(int row, int col) {
    	// 重点:越界判断
    	if (row >= n || col >= m || row < 0 || col < 0) {
    		return 0;
    	}
    	else {
			return mines[row][col] ? 1: 0;
		}
    }
}

C++:
(由 ChatGPT 转换)

#include <iostream>
#include <vector>

using namespace std;

vector<vector<bool>> mines;
int n, m; // n=行,m=列

int getCount(int row, int col);
int hasMine(int row, int col);

int main() {
    // 输入
    cin >> n >> m;
    mines.resize(n, vector<bool>(m, false));
    cin.ignore(); // Consume the newline character

    for (int i = 0; i < n; i++) {
        string line;
        cin >> line;
        for (int j = 0; j < m; j++) {
            mines[i][j] = (line[j] == '*');
        }
    }

    // 计算
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int count = getCount(i, j);
            if (count == -1)
                cout << '*';
            else
                cout << count;
        }
        cout << endl;
    }

    return 0;
}

int getCount(int row, int col) {
    // 是地雷
    if (mines[row][col])
        return -1;

    // 不是地雷
    int count = 0;
    count += hasMine(row - 1, col - 1);
    count += hasMine(row - 1, col);
    count += hasMine(row - 1, col + 1);

    count += hasMine(row, col - 1);
    count += hasMine(row, col);
    count += hasMine(row, col + 1);

    count += hasMine(row + 1, col - 1);
    count += hasMine(row + 1, col);
    count += hasMine(row + 1, col + 1);

    return count;
}

int hasMine(int row, int col) {
    // 重点:越界判断
    if (row >= n || col >= m || row < 0 || col < 0) {
        return 0;
    } else {
        return mines[row][col] ? 1 : 0;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

div盒子放在页面正中间,添加旋转动画的时候,盒子向右下偏移

一、问题代码&#xff08;核心部分&#xff09; //盒子定位在页面正中心 #spinner { position: absolute; left: 50%; top: 50%; border: #2ecc71 solid 1px; transform: translate(-50%, -50%); animation: rotate 5s linear 2s forwards; transform-origin: 50% 50%; } keyfr…

hadoop组成

在hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源调度,耦合性较大; 在hadoop2.x时代,新增了yarn,主要负责资源的调度,MapReduce仅负责运算; 在hadoop3.x时代,在组成上没有变化;

【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;vue要做权限管理该怎么做…

社区活动|Apollo开发者城市活动·长沙站来啦!

Apollo开发者城市活动长沙站 2023/10/22 &#x1f64b;想亲身乘坐无人车&#xff0c;感受自动驾驶技术的魅力吗&#xff1f; &#x1f64b;想与技术大咖面对面&#xff0c;了解自动驾驶的历史与原理吗&#xff1f; &#x1f64b;想与本地开发者交流心得&#xff0c;实现自动…

springboot自动配置原理面试题(自用)

springboot自动装配主要是基于注解编程和约定大于配置的思想设计 核心步骤&#xff1a; 1 组件必须包含configuration并声明为bean注解返回注入到IOC容器中 2 第三方jar包&#xff0c;根据/meta-inf/目录下增加spring.factories文件加载配置文件中的内容 3 springboot获取到…

游戏开发这么久没见过github-lfs-居然不能下载图片的,这就让你见到了解决方法

以前很少见到github上有游戏的整体仓库&#xff0c;还觉得是游戏人都不爱分享 git 是很好的分布式代码管理&#xff0c;但对于大部分的“”云资源“”管理&#xff0c;git的很多原生功能并不擅长 现在想想&#xff0c;其实也合理&#xff0c;基本只要是手游换皮游戏&#xff…

注释的两难之道:程序员的反思

文章目录 代码即注释&#xff1f;注释的艺术1. 注释要言简意赅2. 注释的时机3. 注释内容4. 避免无意义的注释5. 维护注释 如何看待注释&#xff1f; &#x1f389;欢迎来到Java学习路线专栏~注释的两难之道&#xff1a;程序员的反思 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f3…

JDBC批量插入数据

PreparedStatement的一些好处 1.PreparedStatement可以防止SQL注入 2.PreparedStatement可以操作Blob数据,Statement做不到. 3.PreparedStatement可以实现更高效的批量操作 演示PreparedStatement批量操作 在数据库操作中 update,delete后面如果没有条件,本身就可以就可以…

基于html5开发的Win12网页版,抢先体验

据 MSPoweruser 报道&#xff0c;Windows 11虽然刚刚开始步入正轨&#xff0c;但最新爆料称微软已经在开启下一个计划&#xff0c;Windows 12 的开发将在 去年3 月份开始。德国科技网站 Deskmodder.de 称&#xff0c;根据内部消息&#xff0c;微软将在 2022年3 月开始开发 Wind…

02_单片机及开发板介绍

单片机简介 单片机&#xff0c;又称为微控制器&#xff08;Microcontroller&#xff09;&#xff0c;是一种集成了微处理器核心、存储器、输入/输出接口及各种功能模块的集成电路芯片。它通常由中央处理器&#xff08;CPU&#xff09;、存储器、输入/输出接口以及各种外设组成&…

HDLbits: Fsm serial

根据题意设计了四个状态&#xff0c;写出代码如下&#xff1a; module top_module(input clk,input in,input reset, // Synchronous resetoutput done ); parameter IDLE 3b000, START 3b001, DATA 3b010, STOP 3b100, bit_counter_end 4d7;reg [2:0] state,next_sta…

关于TCP协议面试中常见的一千个问题

TCP传输层控制协议 TCP是面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 头部格式 1、 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 2、 序号字段——占 4 字节。TCP 连接中传送的数据流中…

诊断DLL——Vector模板生成Send2Key.dll

文章目录 前言一、Vector诊断控制台Secutity Access基本原理二、Seed2Key DLL生成GenerateKeyEx源码自定义安全算法源码CAPL调用27服务解密算法前言 在实际诊断工程应用中,如UDS刷写——27服务,经常会遇到一些Seed2Key的算法问题,为了安全保密,这个算法的源码不便公开,我…

【C++基础】10. 指针

文章目录 【 1. 指针的定义 】【 2. 指针的调用 】【 3. NULL 空指针 】【 4. 指针的算术运算 】4.1 指针的递加4.2 指针的递减4.3 指针的比较 【 5. 指针与数组 】5.1 通过指针操作数组5.2 指针数组、数组指针 【 6. 指向指针的指针(多级间接寻址)】【 7. 传递指针给函数 】【…

【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说下你的vue项目的目录结…

第三章 内存管理 四、连续分配管理方式

目录 一、内存空间的分配与回收 1、连续分配管理方式 &#xff08;1&#xff09;、单一连续分配 优点&#xff1a; 缺点&#xff1a; &#xff08;2&#xff09;、固定分区分配 分区大小相等&#xff1a; 分区大小不等&#xff1a; &#xff08;3&#xff09;、动态分区…

leetcode17.04面试题:消失的数字

数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 思路1&#xff1a;暴力枚举 定义一个[0~n]的数组与所给数组nums进行循环遍历&#xff0c;如果不相等则返回那个数。 int missingNumber(int…

Git 安装和配置教程:Windows / Mac / Linux 三平台详细图文教程,带你一次性搞定 Git 环境

Git是一款免费、开源的分布式版本控制系统&#xff0c;广泛应用于软件开发领域。随着开源和云计算的发展&#xff0c;Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法&#xff0c;带你一次性搞定Git环境 Windows平台 …

windows计划任务的配置文件

界面操作 创建计划 依次设置 命令行操作 SCHTASKS 命令简介 SCHTASKS 命令是由微软公司开发并内置于 Windows 系统中的一个命令行工具。该命令可用于设置、修改、查询和删除计划任务&#xff0c;或启动计划任务中所定义的程序或脚本。 SCHTASKS 命令的基本语法 SCHTASKS 命…

【算法|动态规划No.20】leetcode416. 分割等和子集

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…