C语言 对下面的代码进行化简或生成函数

cgfeq70w  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(161)

我想看看二维数组中,一个单元格的周围是否都是什么,或者对它们做些什么。

if (mapmines[rndr][rndc] != 9) {
            mapmines[rndr][rndc] = 9;
            if (mapmines[rndr - 1][rndc - 1] != 9)
                mapmines[rndr - 1][rndc - 1]++;
            if (mapmines[rndr - 1][rndc] != 9)
                mapmines[rndr - 1][rndc]++;
            if (mapmines[rndr - 1][rndc + 1] != 9)
                mapmines[rndr - 1][rndc + 1]++;
            if (mapmines[rndr][rndc - 1] != 9)
                mapmines[rndr][rndc - 1]++;
            if (mapmines[rndr][rndc + 1] != 9)
                mapmines[rndr][rndc + 1]++;
            if (mapmines[rndr + 1][rndc - 1] != 9)
                mapmines[rndr + 1][rndc - 1]++;
            if (mapmines[rndr + 1][rndc] != 9)
                mapmines[rndr + 1][rndc]++;
            if (mapmines[rndr + 1][rndc + 1] != 9)
                mapmines[rndr + 1][rndc + 1]++;

我有这个相似的代码exept与不同的代码之间,如果我可以使一个函数或减少?我觉得它的可能性。

k3bvogb1

k3bvogb11#

if (mapmines[rndr][rndc] != 9)
{
    //  Do all elements in a 3x3 grid:
    for (i = -1; i <= 1; ++i)
    for (j = -1; j <= 1; ++j)
        if (mapmines[rndr+i][rndc+j] != 9)
            ++mapmines[rndr+i][rndc+j];

    /*  Set the center element afterward so we do not care about the
        loop above modifying it (gives brevity, not efficiency):
    */
    mapmines[rndr][rndc] = 9;
}

也就是说,用于此目的的首选代码可能会受到上下文的显著影响,包括条件发生的频率、行和列之间的交互等。可能还有其他更有用的数据结构。您必须给予更多上下文。

4dbbbstv

4dbbbstv2#

你可以用这样的函数把它变小一点

void incrementIfNotNine(int *cell) {
    if(*cell != 9) (*cell)++;
}

然后这样称呼它:

incrementIfNotNine(&mapmines[rndr - 1][rndc - 1]);
incrementIfNotNine(&mapmines[rndr - 1][rndc]);
incrementIfNotNine(&mapmines[rndr - 1][rndc + 1]);
...

您也可以使用循环,但对于3x3网格,这几乎不值得。

相关问题