[NOIP2015]扫雷游戏

1.题目

题目链接

题号:NC16491
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入描述:

输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

输出描述:

输出文件包含n行,每行m个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

在这里插入图片描述
在这里插入图片描述
备注:
对于100%的数据,1≤n≤100,1≤m≤100。

2.分析

第一直觉:在最外层构建一层,使得符号被包围,不用担心越界

3.代码

方法1:构建“九宫格”查找

#include <stdio.h>
#include <string.h>

int main()
{
    int n, m;
    int i, j;
    int Row, Column;
    char ChessBoard[150][150] = {'0'};    //棋盘
    int Count = 0;
    scanf("%d %d", &n, &m);
    getchar();   //吞掉\n防止下一步获取

    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
            scanf("%c", &ChessBoard[i][j]);   //依次输入每个字符
        getchar();    //吞掉\n
    }


    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            if (ChessBoard[i][j] == '*')
                printf("*");
            else
            {
                Count = 0;
                for (Row = i - 1; Row <= i + 1; Row++)     //构建九宫格查找
                {
                    for (Column = j - 1; Column <= j + 1; Column++)
                    {
                        if (ChessBoard[Row][Column] == '*')
                            Count++;
                    }
                }
                printf("%d", Count);
            }
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述
附加例子:
对外层的符号类似这样附加

000
0*0
000

方法2:直接将查找的函数单独分离出来

每一次调用查找函数,并输出相应的值

#include <stdio.h>
#define N 120
char Board[N][N];
int n,m;
void Search(int x,int y);

int main()
{
    int i,j;
    scanf("%d%d",&n,&m);   //输入行 列
    getchar();
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%c",&Board[i][j]);
        }
        getchar();    //吞 \n
    }
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(Board[i][j]=='*')
                printf("*");
            else
                Search(i,j);   //查找
        }
        printf("\n");
    }
    return 0;
}


void Search(int x,int y)
{
    int Line,Row,count=0;
    for(Line=-1;Line<2;Line++)
    {
        for(Row=-1;Row<2;Row++)
        {
            int line=x+Line;
            int row=y+Row;
            if(line>=0&&line<n&&row>=0&&row<m&&Board[line][row]=='*')   //当周围有'*'时
                count++;
        }
    }
    printf("%d",count);
}

在这里插入图片描述

方法3:找到 ’ * ‘令其周围不是’ * '的值+1

#include <stdio.h>

char Board[120][120]={'0'};
int n,m;

void SumCount(int i,int j)
{
    if(i>=0&&i<=n&&j>=0&&j<=m&&Board[i][j]!='*')
        Board[i][j]++;
}

int main()
{
    int i,j;
    int Line,Row;
    scanf("%d%d",&n,&m);   //输入行数和列数
    getchar();
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%c",&Board[i][j]);
            if(Board[i][j]!='*')     //不是'*'的标记为'0'
                Board[i][j]='0';
        }
        getchar();
    }
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(Board[i][j]=='*')
            {
                for(Line=i-1;Line<=i+1;Line++)
                {
                    for(Row=j-1;Row<=j+1;Row++)
                        SumCount(Line,Row);  //更新九宫格的值
                }
            }
        }
    }
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            printf("%c",Board[i][j]);
        printf("\n");
    }
    
    return 0;
}

在这里插入图片描述

4.总结

灵活运用循环,解决边界条件
合理转化为等价的条件

5.更新日志

2022.3.22 整理

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 扫雷游戏可以通过使用 JavaScript 和 HTML 进编写实现。下面是一份简单的 HTML 代码示例: ``` <html> <head> <style> table { border-collapse: collapse; } td { width: 30px; height: 30px; border: 1px solid black; text-align: center; } </style> </head> <body> <table id="minefield"></table> <script> const MINE = "💣"; const EMPTY = "⬜️"; function createMinefield(rowCount, columnCount, mineCount) { const minefield = []; for (let row = 0; row < rowCount; row++) { minefield.push([]); for (let column = 0; column < columnCount; column++) { minefield[row].push(EMPTY); } } let minePlaced = 0; while (minePlaced < mineCount) { const row = Math.floor(Math.random() * rowCount); const column = Math.floor(Math.random() * columnCount); if (minefield[row][column] !== MINE) { minefield[row][column] = MINE; minePlaced++; } } return minefield; } function renderMinefield(minefield) { const table = document.querySelector("#minefield"); table.innerHTML = ""; for (const row of minefield) { const tr = document.createElement("tr"); for (const cell of row) { const td = document.createElement("td"); td.textContent = cell; tr.appendChild(td); } table.appendChild(tr); } } const minefield = createMinefield(10, 10, 20); renderMinefield(minefield); </script> </body> </html> ``` 这段代码实现了一个 10x10 的扫雷游戏,带有 20 个地雷。可以在 HTML 文件中直接运,以在浏览器中体验扫雷游戏。 ### 回答2: 要编写一个可在HTML中运扫雷游戏,需要使用HTML、CSS和JavaScript进开发。以下是一个简单的实现示例: HTML部分: ```html <!DOCTYPE html> <html> <head> <title>扫雷游戏</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div id="board"></div> <script src="script.js"></script> </body> </html> ``` CSS部分(style.css): ```css #board { display: grid; grid-template-columns: repeat(10, 40px); grid-template-rows: repeat(10, 40px); } .cell { background-color: #c0c0c0; border: 1px solid #ffffff; text-align: center; font-size: 24px; vertical-align: middle; line-height: 40px; } ``` JavaScript部分(script.js): ```javascript document.addEventListener("DOMContentLoaded", () => { const board = document.getElementById("board"); // 创建游戏棋盘 for (let i = 0; i < 10; i++) { for (let j = 0; j < 10; j++) { const cell = document.createElement("div"); cell.classList.add("cell"); cell.setAttribute("data-row", i); cell.setAttribute("data-col", j); board.appendChild(cell); } } // 添加点击事件监听器 board.addEventListener("click", handleCellClick); }); function handleCellClick(event) { const cell = event.target; const row = cell.getAttribute("data-row"); const col = cell.getAttribute("data-col"); // 处理点击事件逻辑 // ... } ``` 这只是一个快速实现的示例,实际上,你还需要处理点击事件逻辑,添加雷区、计算雷数等功能,以及其他样式和功能的调整。希望这个简单的实现示例能为你提供一些帮助。 ### 回答3: 实现一个在HTML中运扫雷游戏可以通过使用HTML、CSS和JavaScript来完成。下面是一个简单的示例: 首先,在HTML文件的`<head>`标签中添加以下样式: ```html <style> .board { display: grid; grid-template-columns: repeat(10, 1fr); gap: 1px; } .cell { width: 30px; height: 30px; background-color: grey; border: 1px solid black; text-align: center; vertical-align: middle; cursor: pointer; } .cell.clicked { background-color: white; cursor: default; } </style> ``` 然后,在`<body>`标签中创建一个棋盘和一些JavaScript代码来处理游戏逻辑。以下是一个简单的示例: ```html <body> <div class="board"> <div class="cell"></div> <div class="cell"></div> <!-- ... repeat for 100 cells --> </div> <script> // 游戏逻辑代码 const board = document.querySelector('.board'); const cells = document.querySelectorAll('.cell'); // 生成雷区 function generateMines() { // 随机选择10个格子作为雷 const mineIndices = []; while (mineIndices.length < 10) { const index = Math.floor(Math.random() * 100); if (!mineIndices.includes(index)) { mineIndices.push(index); } } // 在雷区中显示雷 mineIndices.forEach(index => { cells[index].dataset.mine = 'true'; }); } generateMines(); // 初始化雷区 // 处理点击事件 function handleClick(event) { const cell = event.target; cell.classList.add('clicked'); if (cell.dataset.mine === 'true') { alert('踩到雷!游戏结束!'); } } cells.forEach(cell => cell.addEventListener('click', handleClick)); </script> </body> ``` 该示例代码创建了一个10x10的棋盘,并在其中随机生成10个雷。当用户点击一个格子时,该格子会被标记为"clicked",并检查是否为雷。如果是雷,则会弹出提示框并游戏结束。 这只是一个简单的示例,你可以根据需要添加更多的游戏规则和功能。希望这能帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值