扫雷游戏

#include<stdio.h>
#include<stdlib.h>
class Bomb
{
public:
    Bomb(int n, int m) : m_line(n), m_column(m)
    {
        m_arr = new int* [n];
        m_isVisited = new int* [n];
        for (int i = 0; i < n; i++)
        {
            m_arr[i] = new int[m];
            m_isVisited[i] = new int[m];
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                m_isVisited[i][j] = 0;//has not been visited yet
                m_arr[i][j] = 0;
            }
        }
    };
    ~Bomb() {
        //delete array
    };
    
    int Traversal(int x, int y);
    void Initialize();
    int IsBomb(int x, int y);
    int** m_arr;
    int** m_isVisited;
private:
    int m_line;
    int m_column;

    
  

};

int Bomb::Traversal(int x, int y)
{
    //out of range
    if (x < 0 || y < 0 || y >= m_column || x >= m_line)
    {
        return 0;
    }
    //(x,y) has been visited before
    if (1 == m_isVisited[x][y])
        return 1;
    if (0 == m_arr[x][y])
    {
        m_isVisited[x][y] = 1; //set it been visited
        Traversal(x - 1, y-1);
        Traversal(x - 1, y);
        Traversal(x - 1, y+1);
        Traversal(x, y - 1);
        Traversal(x, y + 1);
        Traversal(x + 1, y - 1);
        Traversal(x + 1, y);
        Traversal(x + 1, y + 1);
    }
    else {
        //a bomb(999) or number boundary
        if (999 == m_arr[x][y])
            return 0;
        m_isVisited[x][y] = 1; //visit number boudary
 //       printf("%d", m_arr[x][y]);
            return 0;
    }
    return 0;

}
int Bomb::IsBomb(int x, int y)
{
    //out of range
    if (x < 0 || y < 0 || y >= m_column || x >= m_line)
    {
        return 0;
    }
    if (999 == m_arr[x][y])
        return 1;
    return 0;

}
void Bomb::Initialize()
{
    for (int i = 0; i < m_line; i++)
    {
        for (int j = 0; j < m_column; j++)
        {
            int sum = 0;
            if (999 == m_arr[i][j])
                continue;
            sum = IsBomb(i - 1, j - 1) + IsBomb(i - 1, j) + IsBomb(i - 1, j + 1) + IsBomb(i, j - 1) + IsBomb(i, j + 1) + IsBomb(i + 1, j - 1) + IsBomb(i + 1, j) + IsBomb(i + 1, j + 1);
            m_arr[i][j] = sum;
        }
    }
}
int main(void)
{
    int n = 0;
    int m = 0;
    scanf_s("%d%d", &n, &m);
    Bomb obj(n,m);
    int x = 0;
    int y = 0;
    scanf_s("%d%d", &x, &y);
    
    for (int i = 0;i < n;i++)
    {
       char tmp = getchar();//eat '\n'
       for (int j = 0;j < m;j++)
        {
            char in = getchar();
            if ('*' == in)
                obj.m_arr[i][j] = 999;           
        }
    }
 

    obj.Initialize();
#if 0
    for (int i = 0;i < n;i++)
    {
        for (int j = 0;j < m;j++)
        {
            printf("%d", obj.m_arr[i][j]);
        }
        printf("\n");
    }
#endif

    if (obj.IsBomb(x-1, y-1))
    {
        printf("GG");
        return 0;
    }
    obj.Traversal(x-1, y-1);
#if 0
    for (int i = 0;i < n;i++)
    {
        for (int j = 0;j < m;j++)
        {
            printf("%d", obj.m_isVisited[i][j]);
        }
        printf("\n");
    }
#endif

    for (int i = 0;i < n;i++)
    {
        for (int j = 0;j < m;j++)
        {
            if (obj.m_isVisited[i][j] == 1)
            {
                printf("%d", obj.m_arr[i][j]);
                continue;
            }
            else
            {               
                if (obj.m_arr[i][j] == 999)
                    printf("*");
                else printf(".");
            }
        }
        printf("\n");
    }

    return 0;
}

 

posted @ 2020-07-29 10:44  hitzzq  阅读(58)  评论(0编辑  收藏  举报