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:
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.
Où vais-je tort?
Merci beaucoup ..:) ... Pourriez-vous s'il vous plaît expliquer la question que j'ai posée à la fin? –
Le commentaire sur 'main()' devoir retourner explicitement n'est plus vrai depuis la norme de 1999. – Peter
Mais dans ce cas, il devrait être 'void main' droit? –