No xadrez, a rainha não pode ser limitado ao número de passos para comer outras peças nas linhas horizontais, verticais e diagonais. Como oito rainhas no tabuleiro de xadrez (8x8 quadrados), de modo que eles não podem ser consumidos por qualquer pessoa! Este é o famoso problema oito rainhas.
Conhecido problema 8 damas definir um total de 92 soluções, isto é, 92 cadeias diferentes Rainha
Retrocesso: também conhecido como "heurística". Ao resolver problemas, não um passo, tente manter a atitude é, se encontrarmos a seleção atual alcançar seu propósito ou não ideal, então imediatamente fazer uma operação de retirada.
Retrocesso e recursão:
recursão: você está muito claro o que fazer (como andar cada passo que você está bem consciente)
de volta: um pouco semelhante ao método de força bruta, todas as circunstâncias para tentar novamente, se você continuar a ir para baixo da linha, se não voltar para baixo . Retrocesso pode ser conseguido quando se utiliza recursiva
Ideias: 1, a partir de a-th de zero linha, a primeira linha 0 coluna 0 colocação de uma rainha, uma rainha, por sua vez colocada em posição na primeira linha para a sétima linha, que determina se a rainha posição de colocação, em caso negativo, em seguida, nesta posição a posição traseira e, em seguida, tentar colocar uma rainha, se você pode então colocar uma rainha nesta posição, e, em seguida, a próxima linha a tentar, se a linha todas as posições não for possível, em seguida, volta para a linha, muda rainha em uma linha posição, continuar a tentar para baixo
2, se você tentar a última linha ea última posição da linha pode colocar a rainha, então nosso objetivo foi alcançado.
3. Se a tentativa for bem sucedido, então usar o mesmo método para continuar a tentar outro método pêndulo diferente.
//两个全局变量
int board[8][8] = {0}; //棋盘
int sum = 0; //计数器
//如果可以摆放皇后则返回 1,否则返回 0
int check(int row, int col) //判断(row, col)位置是否可以摆放皇后
{
int i, j;
//判断第col列有没有皇后
for(i = 0; i < 8; i++)
{
if( 1 == board[i][col] )
return 0;
}
//判断左上对角线有没有皇后
for(i = row, j = col; i >= 0 && j >= 0; i--, j--)
{
if( 1 == board[i][j] )
return 0;
}
//判断右上对角线有没有皇后
for(i = row, j = col; i >= 0 && j < 8; i--, j++)
{
if( 1 == board[i][j] )
return 0;
}
return 1;
}
//放皇后
void put_queen(int row)
{
if(8 == row) //递归结束条件
{
sum++; //找到一种解法,计数器++
return;
}
int i;
for(i = 0; i < 8; i++)
{
if( check(row, i) )
{
board[row][i] = 1; //放下皇后
put_queen(row + 1); //递归
board[row][i] = 0; //回溯前把之前的皇后标记清零
}
}
}
int main(void)
{
put_queen(0); //从第0行开始放皇后
printf("总共有 %d 种摆法\n", sum); //总共有92种摆法
return 0;
}