刚刚做了16年蓝桥杯A组省赛的第七题,剪邮票,遇见了一个匪夷所思的错误,让我痛苦不堪!
题,无所谓,主要看代码!
代码C:

#include <stdio.h>
int stamps[12] = {
  0};
int ans = 0;

void test(int i, int j, int k, int q, int w)
{
    //上下左右四个方向
    int dir[4] = {-4, 4, -1 , 1};
    int r = 0, edge = 0, flagI = 0, flagJ = 0, flagK = 0, flagQ = 0, flagW = 0;
    for (; r < 4; r++)
    {
        if (stamps[i + dir[r]] == 1 && !((i == 3 || i == 7) && r == 3) && !((i == 4 || i == 8) && r == 2))
        {
            edge++;
            flagI = 1;
        }
        if (stamps[j + dir[r]] == 1 && !((j == 3 || j == 7) && r == 3) && !((j == 4 || j == 8) && r == 2))
        {
            edge++;
            flagJ = 1;
        }
        if (stamps[k + dir[r]] == 1 && !((k == 3 || k == 7) && r == 3) && !((k == 4 || k == 8) && r == 2))
        {
            edge++;
            flagK = 1;
        }
        if (stamps[q + dir[r]] == 1 && !((q == 3 || q == 7) && r == 3) && !((q == 4 || q == 8) && r == 2))
        {
            edge++;
            flagQ = 1;
        }
        if (stamps[w + dir[r]] == 1 && !((w == 3 || w == 7) && r == 3) && !((w == 4 || w == 8) && r == 2))
        {
            edge++;
            flagW = 1;
        }
    }

    if (edge >= 8 && flagI == 1 && flagJ == 1 && flagK == 1 && flagQ == 1 && flagW == 1)
    {
        ans++;
// printf("%d\n", ans);
// for (int m = 0; m < 4; m++)
// {
   
// printf("%d ", stamps[m]);
// }
// printf("\n");
// for (int m = 4; m < 8; m++)
// {
   
// printf("%d ", stamps[m]);
// }
// printf("\n");
// for (int m = 8; m < 12; m++)
// {
   
// printf("%d ", stamps[m]);
// }
// printf("\n");
// printf("\n");
    }
    return ;
}

void vid()
{
    int i, j, k, q, w;
    for (i = 0; i < 8; i++)
    {
        stamps[i] = 1;
        for (j = i + 1; j < 9; j++)
        {
            stamps[j] = 1;
            for (k = j + 1; k < 10; k++)
            {
                stamps[k] = 1;
                for (q = k + 1; q < 11; q++)
                {
                    stamps[q] = 1;
                    for (w = q + 1; w < 12; w++)
                    {
                        stamps[w] = 1;
                        test(i, j, k, q, w);
                        stamps[w] = 0;
                    }
                    stamps[q] = 0;
                }
                stamps[k] = 0;
            }
            stamps[j] = 0;
        }
        stamps[i] = 0;
    }
    return ;
}

int main(int argc, const char * argv[])
{
    vid();
    printf("%d\n", ans);
    return 0;
}

就这一段代码,在我的Xcode中运行结果是117(已知117是错的,116是正确的),哭哭思索,不知问题出在哪里,于是我又加上了一段调试代码,即上述代码中注释的部分,再次运行,和谐了-_-#,结果竟然变成了116,正确了!这让我百思不得其解,我只是加上了一串纯输出的代码,怎么会导致结果的差异呢?

求解!求解!求解!