小花fa 2023-04-28 19:42 采纳率: 50%
浏览 25
已结题

写的扫雷递归感觉没错,但是报错

真的不知道错哪了


void get_put(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int z)
{
    for (int i = x - 1; i <= x + 1; i++)
    {
        for (int j = y - 1; j <= y + 1; j++)
        {
            if (mine[i][j] == '1')
            {
                z++;
            }
        }
    }
    if (z == 0)
    {
        for (int i = x - 1; i <= x + 1; i++)
        {
            for (int j = y - 1; j <= y + 1; j++)
            {
                get_put(mine, show, i, j, z);
            }
        }
    }
    show[x][y] = z + '0';
    extern int q;
    q++;
}


img

  • 写回答

2条回答 默认 最新

  • Py小郑 新星创作者: python技术领域 2023-04-28 20:07
    关注

    在递归函数中,如果当前格子周围没有雷(z==0),会再次调用get_put函数进行递归。但是,您没有判断周围的格子是否越界,可能会导致数组越界错误。因此,需要添加判断语句来确保周围的格子不会越界。

    在递归函数中,您传递的参数z应该是当前格子周围的雷数,而不是一开始传递的0。因为z的值应该是动态变化的,随着递归的进行而改变。因此,在调用递归函数时,应该传递当前格子周围的雷数。

    在递归函数中,您需要判断当前格子是否已经被翻开,如果已经翻开则不需要再次翻开。因为如果已经翻开,则说明当前格子周围的雷数已经被计算出来了,不需要再次递归计算。

    最后,根据您提供的代码,似乎您没有对扫雷游戏进行初始化操作。在开始游戏前,需要将雷的位置随机生成,并将show数组初始化为未翻开状态。

    
    void get_put(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
    {
    int z = 0;
    for (int i = x - 1; i <= x + 1; i++)
    {
    for (int j = y - 1; j <= y + 1; j++)
    {
    if (i >= 0 && i < ROWS && j >= 0 && j < COLS && mine[i][j] == '1' && show[i][j] != '*')
    {
    z++;
    }
    }
    }
    if (z == 0)
    {
    for (int i = x - 1; i <= x + 1; i++)
    {
    for (int j = y - 1; j <= y + 1; j++)
    {
    if (i >= 0 && i < ROWS && j >= 0 && j < COLS && show[i][j] == '-')
    {
    get_put(mine, show, i, j);
    }
    }
    }
    }
    show[x][y] = z + '0';
    extern int q;
    q++;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 已采纳回答 4月28日
  • 创建了问题 4月28日