匪夷所思的错误-16年蓝桥杯A组省赛的第七题-剪邮票
刚刚做了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,正确了!这让我百思不得其解,我只是加上了一串纯输出的代码,怎么会导致结果的差异呢?
求解!求解!求解!