X。535 2021-03-10 17:01 采纳率: 50%
浏览 368
已采纳

求助,扫雷计数,计算扫雷中出现数字之和

描述

扫雷(Minesweeper)是一个有趣的小游戏。玩家需要根据数字的提示,在不触雷的条件下把所有不是雷的区域翻开才能胜利;一旦触雷即告失败。扫雷游戏的高级(16x30,99雷)世界纪录为31.133秒,由波兰人KamilMuranski保持。
扫雷盘面中,某格中数字的含义是其周围相邻8格(如果是边界或角则相应为5格或3格)中含有的雷的个数。相信大家通过对于上图的分析,能够理解这个含义。
本题要求对于一个雷区(给定大小以及雷的位置),计算盘面所有数字的和。

输入

 

输入包含若干行。
第一行是两个整数M,N,以空格分开,代表雷区的行数和列数。1 <= M <= 50,1 <= N <= 50。
第二行是一个整数K,代表雷区中雷的个数,0 <= K <= M*N。
接下来K行代表K个雷的位置,每行有两个用空格分开的整数,分别代表这个雷的所在的行R(1 <= R <=M)和列C(1 <= C <=N)。数据保证这K行中没有重复。

输出

 

一个整数,代表该雷区中所有数字之和。注意,如果一个雷区中全是雷,其数字之和为0;如果一个雷区中没有雷,其数字之和也为0。

输入样例 1 

8 8
10
1 1
1 7
3 8
4 4
4 8
5 8
6 3
6 8
7 8
8 8

输出样例 1

42

编出来的几个程序都没有过,实在不太会了,谢谢大家!

  • 写回答

2条回答 默认 最新

  • 娃无法李姐 2021-03-17 14:17
    关注

    #include <iostream>
    #include <time.h>
    using namespace std;
    int main()
    {
        int M, N;//行和列
        //printf("请输入行和列");
        cin >> M>>N;
        int **matrix=new int*[M];//二维动态数组
        for (int i = 0; i < M; i++)
        {
            matrix[i] = new int[N];
        }
        //二维数组直接置为0
        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {
                matrix[i][j] = 0;
            }
        }


        srand(time(NULL));

        int n ;//雷的数量
        //printf("请输入雷的数量:");
        cin >> n;
        while (n--)
        {
            int line;
            int row ;
            cin >> line >> row;
            if (matrix[line-1][row-1] == 0)
            {
                matrix[line-1][row-1] = -1;
            }
            else
            {
                continue;
            }
        }


        int res = 0;//总和
        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (matrix[i][j] != -1)
                {
                    int leftIndex = j - 1;
                    int rightIndex = j + 1;
                    int topIndex = i - 1;
                    int bottomIndex = i + 1;

                    int left = leftIndex;
                    int top = topIndex;

                    int leftMoveStep = 0;
                    int topMoveStep = 0;
                    int count = 0;
                    while (true)
                    {
                        //周围八个位置的状态
                        if (left >= 0 && left < M && top >= 0 && top < N)
                        {
                            if (matrix[top][left] == -1)
                            {
                                count++;
                            }
                        }
                        //
                        if (left == leftIndex && top == i)
                        {
                            break;
                        }

                        if (left - leftIndex < 2 && top == topIndex)
                        {
                            leftMoveStep = 1;
                            topMoveStep = 0;
                        }
                        else if (left == rightIndex && top == topIndex)
                        {
                            topMoveStep = 1;
                            leftMoveStep = 0;
                        }
                        else if (left == rightIndex && top == bottomIndex)
                        {
                            topMoveStep = 0;
                            leftMoveStep = -1;
                        }
                        else if (left == leftIndex && top == bottomIndex)
                        {
                            leftMoveStep = 0;
                            topMoveStep = -1;
                        }
                        else if (left - leftIndex < 2 && top == bottomIndex)
                        {
                            leftMoveStep = -1;
                            topMoveStep = 0;
                        }
                        left += leftMoveStep;
                        top += topMoveStep;
                    }

                    matrix[i][j] = count;

                    res += count;
                }
     
            }
                      
        }
        cout << res;
    }
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料