algoritmo de aprendizagem: Oito Rainhas problema (retrocesso)

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;
}
Publicado 50 artigos originais · ganhou elogios 5 · Vistas 1532

Acho que você gosta

Origin blog.csdn.net/qq_42483691/article/details/104580545
Recomendado
Clasificación