注册 登录
编程论坛 C语言论坛

扫雷的搜索步骤的函数出现溢出,找不到原因,求助!

好烦、 发布于 2021-01-01 21:41, 1281 次点击
对于一个二维数组(第三维可忽略不看),对输入的点的周围进行判断,此代码中全为非雷,会全部递归搜索,为何溢出?

#include <conio.h>
#include<stdio.h>

void scanaround(int land[15][15][3], int i, int j)
{
    int q,w,e,a,d,z,x,c;//描述周围的点有无雷
    int k,t = 0;
    q=w=e=a=d=z=x=c=0;
    if (i == 0)
    {
        if (j == 0)
        {
            //扫描右面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k][j + 1][0] == 0 )                //地面
                {
                    if(k == 0)
                        d = 1;
                    else
                        c = 1;
                }
                else if (land[i + k][j + 1][0] == 1)            //地雷
                    t++;   
            }
            //扫描下面
            if (land[i + 1][j][0] == 0)
                x = 1;
            else if (land[i + 1][j][0] == 1)
                t++;
        }
        else if (j == 14)
        {
            //扫描左面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k][j - 1][0] == 0)            //地面
                {
                    if(k == 0)
                        a = 1;
                    else
                        z = 1;
                }
                else if (land[i + k][j - 1][0] == 1)
                    t++;
            }
            //扫描下面
            if (land[i + 1][j][0] == 0)
                x = 1;
            else if (land[i + 1][j][0] == 1)
                t++;
        }
        else
        {
            //扫描右面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k][j + 1][0] == 0)            //地面
                {
                    if(k == 0)
                        d = 1;
                    else
                        c = 1;
                }
                else if (land[i + k][j + 1][0] == 1)
                    t++;
            }
            //扫描左面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k][j - 1][0] == 0)            //地面
                {
                    if(k == 0)
                        a = 1;
                    else
                        z = 1;
                }
                else if (land[i + k][j - 1][0] == 1)
                    t++;
            }
            //扫描下面
            if (land[i + 1][j][0] == 0)
                x = 1;
            else if (land[i + 1][j][0] == 1)
                t++;
        }
    }
    else if (i == 14)
    {
        if (j == 0)
        {
            //扫描右面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k - 1][j + 1][0] == 0)            //地面
                {
                    if(k == 0)
                        e = 1;
                    else
                        d = 1;
                }
                else if (land[i + k - 1][j + 1][0] == 1)
                    t++;
            }
            //扫描上面
            if (land[i - 1][j][0] == 0)
                w = 1;
            else if (land[i - 1][j][0] == 1)
                t++;
        }
        else if (j == 14)
        {
            //扫描左面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k - 1][j - 1][0] == 0)            //地面
                {
                    if(k == 0)
                        q = 1;
                    else
                        a = 1;
                }
                else if (land[i + k - 1][j - 1][0] == 1)
                    t++;
            }
            //扫描上面
            if (land[i - 1][j][0] == 0)
                w = 1;
            else if (land[i - 1][j][0] == 1)
                t++;
        }
        else
        {
            //扫描右面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k - 1][j + 1][0] == 0)            //地面
                {
                    if(k == 0)
                        e = 1;
                    else
                        d = 1;
                }
                else if (land[i + k - 1][j + 1][0] == 1)
                    t++;
            }
            //扫描左面
            for (k = 0; k < 2; k++)
            {
                if (land[i + k - 1][j - 1][0] == 0)            //地面
                {
                    if(k == 0)
                        q = 1;
                    else
                        a = 1;
                }
                else if (land[i + k - 1][j - 1][0] == 1)
                    t++;
            }
            //扫描上面
            if (land[i - 1][j][0] == 0)
                w = 1;
            else if (land[i - 1][j][0] == 1)
                t++;
        }
    }
    else if (i != 0 && i != 14)
    {
        if (j == 0)
        {
            //扫描右面
            for (k = 0; k < 3; k++)
            {
                if (land[i - 1 + k][j + 1][0] == 0)
                {
                    if(k == 0)
                        e = 1;
                    else if(k == 1)
                        d = 1;
                    else if(k == 2)
                        c = 1;
                }
                else if (land[i - 1 + k][j + 1][0] == 1)
                    t++;
            }
            //扫描上下
            if (land[i - 1][j][0] == 0)
                w = 1;
            else if (land[i - 1][j][0] == 1)
                t++;
            if (land[i + 1][j][0] == 0)
                x = 1;
            else if (land[i + 1][j][0] == 1)
                t++;
        }
        else if (j == 14)
        {
            //扫描左面
            for (k = 0; k < 3; k++)
            {
                if (land[i - 1 + k][j - 1][0] == 0)
                {
                    if(k == 0)
                        q = 1;
                    else if(k == 1)
                        a = 1;
                    else if(k == 2)
                        z = 1;
                }
                else if (land[i - 1 + k][j - 1][0] == 1)
                    t++;
            }
            //扫描上下
            if (land[i - 1][j][0] == 0)
                w = 1;
            else if (land[i - 1][j][0] == 1)
                t++;
            if (land[i + 1][j][0] == 0)
                x = 1;
            else if (land[i + 1][j][0] == 1)
                t++;
        }
        else
        {
            //扫描上面
            for (k = 0; k < 3; k++)
            {
                if (land[i - 1][j + k - 1][0] == 0)
                {
                    if(k == 0)
                        q = 1;
                    else if(k == 1)
                        w = 1;
                    else if(k == 2)
                        e = 1;
                }
                else if (land[i - 1][j + k - 1][0] == 1)
                    t++;
            }
            //扫描下面
            for (k = 0; k < 3; k++)
            {
                if (land[i + 1][j + k - 1][0] == 0)
                {
                    if(k == 0)
                        z = 1;
                    else if(k == 1)
                        x = 1;
                    else if(k == 2)
                        c = 1;
                }
                else if (land[i + 1][j + k - 1][0] == 1)
                    t++;
            }
            //扫描左右
            if (land[i][j - 1][0] == 0)
                a = 1;
            else if (land[i][j - 1][0] == 1)
                t++;
            if (land[i][j + 1][0] == 0)
                d = 1;
            else if (land[i][j + 1][0] == 1)
                t++;
        }
    }
    if(t == 0)
    {
        if(q == 1)
            scanaround(land,i-1,j-1);
        if(w == 1)
            scanaround(land,i-1,j);
        if(e == 1)
            scanaround(land,i-1,j+1);
        if(a == 1)
            scanaround(land,i,j-1);
        if(d == 1)
            scanaround(land,i,j+1);
        if(z == 1)
            scanaround(land,i+1,j-1);
        if(x == 1)
            scanaround(land,i+1,j);
        if(c == 1)
            scanaround(land,i+1,j+1);
    }
    land[i][j][0] = 3;//本质状态改为揭开
    land[i][j][1] = 10 + t;    //显示的要输出的数
    land[i][j][2] = 0;    //不在此状态
}
int main(void)
{    int i,j;
    int land[15][15][3];
    for(int i=0;i<15;i++)
    {
        for(int j=0;j<15;j++)
        {
            land[i][j][0] = 0;
        }
    }
    scanf("%d%d",&i,&j);
    scanaround(land,i,j);
    printf("po");
    return 0;
}
1 回复
#2
好烦、2021-01-01 21:49
会不会是开的局部变量太多了呢
1