2016-12-28 2 views
0

Je résous le problème de 8 reines en utilisant le retour en arrière. Quand j'ai compilé le code suivant dans IDE de codechef, il a montré une sortie correcte, mais il montre quand même une erreur d'exécution.Pourquoi le code suivant génère-t-il une erreur d'exécution, même s'il indique la sortie souhaitée?

#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; 
    } 
} 

Sortie:

enter image description here

De plus, si je change la déclaration du conducteur "queen(0,0,0) or queen(1,0,0)", le résultat est bien correct jusqu'à 4-5 colonnes, mais est plein de 0 dans la ceux qui restent.

enter image description here

Où vais-je tort?

Répondre

0

il suffit de regarder à votre routine principale:

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

il est censé revenir 0 à la réussite, mais vous ne retournez pas rien: même si votre programme fait ce que vous voulez, puisque votre code de retour est indéfini.

N'est pas susceptible d'être 0 dans ce cas => vu comme une mauvaise exécution par le moteur qui l'exécute, ce qui n'essaie même pas d'aller plus loin dans l'analyse de la sortie du programme.

Fix:

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

Comme plusieurs personnes ont commenté, la déclaration return 0 n'est pas obligatoire dans C99. Mais je suppose que votre plate-forme en ligne applique des règles C89 strictes, vous devez donc l'ajouter.

+0

Merci beaucoup ..:) ... Pourriez-vous s'il vous plaît expliquer la question que j'ai posée à la fin? –

+1

Le commentaire sur 'main()' devoir retourner explicitement n'est plus vrai depuis la norme de 1999. – Peter

+0

Mais dans ce cas, il devrait être 'void main' droit? –