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

描述

扫雷(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

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

#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;
}