2016-12-28 54 views
0

我正在使用回溯解决8皇后问题。当我在codechef IDE中编译以下代码时,它显示正确的输出,但仍显示运行时错误。为什么下面的代码抛出运行时错误,即使它显示所需的输出?

#include <stdio.h> 
#include <math.h> 
int board[8][8] = { { 0 } }; 
int demi[8][8] = { { 0 } }; 
int queen(int a, int b, int c); 
void mark(int a, int b); 
int main() 
{ 
    int i; 
    int b = queen(3, 0, 0); 
    for (i = 0; i < 64; i++) 
    { 
     int x = board[i/8][i % 8]; 
     if (x == 1) 
      printf(" %d ", x); 
     else 
     { 
      printf(" 0 "); 
     } 
     if ((i + 1) % 8 == 0) 
      printf("\n"); 
    } 
} 
int queen(int a, int b, int c) 
{ 
    int t; 
    if (c == 8) 
     return 1; 
    if (a < 0 || a > 7 || b < 0 || b > 7) 
     return 0; 
    if (!(board[a][b] == 0)) 
     return 0; 
    for (t = 0; t < 64; t++) 
    { 
     demi[t/8][t % 8] = board[t/8][t % 8]; 
    } 
    mark(a, b); 
    board[a][b] = 1; 
    /* for(t = 2; t<8; t++) 
    { 
    if(queen(a+(9-t), b+1, c+1)) 
    return 1; 
    if(queen(a-t, b+1, c+1)) 
    return 1; 
    }*/ 
    if (queen(a + 7, b + 1, c + 1)) 
     return 1; 
    if (queen(a + 6, b + 1, c + 1)) 
     return 1; 
    if (queen(a + 5, b + 1, c + 1)) 
     return 1; 
    if (queen(a + 4, b + 1, c + 1)) 
     return 1; 
    if (queen(a + 3, b + 1, c + 1)) 
     return 1; 
    if (queen(a + 2, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 2, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 3, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 4, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 5, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 6, b + 1, c + 1)) 
     return 1; 
    if (queen(a - 7, b + 1, c + 1)) 
     return 1; 
    board[a][b] = 0; 
    for (t = 0; t < 64; t++) { 
     board[t/8][t % 8] = demi[t/8][t % 8]; 
    } 
    return 0; 
} 
void mark(int a, int b) 
{ 
    int i; 
    for (i = 0; i < 64; i++) 
    { 
     int row = i/8; 
     int col = i % 8; 
     if (row == a || col == b && !(row == a && col == b)) 
      board[row][col] = 2; 
     if (abs(row - a) == abs(col - b)) 
      board[row][col] = 2; 
    } 
} 

输出:

enter image description here

此外,如果我改变了驱动程序语句为“queen(0,0,0) or queen(1,0,0)”,其结果是高达4-5列以及正确的,但充满在0的剩下的。

enter image description here

我要去哪里错了?

回答

0

只是看你的主程序:

int main() 
{ 
    ... 
    if((i+1)%8==0) 
    printf("\n"); 
} 

它应该是在成功完成返回0,但你不返回任何东西:所以,即使你的程序你想要做什么,因为你的返回码未定义。

在这种情况下不可能为0 =>被引擎执行错误的执行视为错误执行,甚至不会进一步分析程序输出。

修复:

if((i+1)%8==0) 
    printf("\n"); 
    return 0; 
} 

正如一些人评论说,在return 0说法是不是在C99强制性的。但是我想你的在线平台会执行严格的C89规则,所以你必须添加它。

+0

非常感谢..:)...请您介绍一下我在最后提出的问题吗? –

+1

自从1999年的标准以来,关于'main()'不得不显式返回的注释不再是真的。 – Peter

+0

但是在这种情况下,它应该是'void main'吧? –