43
Problema das N rainhas MARCOS CASTRO

Problema das N rainhas (Backtracking)

Embed Size (px)

Citation preview

Problema das N rainhas

MARCOS CASTRO

Problema Imagine um tabuleiro 8x8...

Problema Objetivo: colocar 8 rainhas sem que elas possam se atacar pela linha, coluna ou diagonal.

Problema Vamos representar o R como sendo a rainha...

Problema Vamos colocar a primeira rainha...

Problema Vamos colocar a segunda rainha...

R

Problema Ops, as rainhas se atacam pela diagonal! Vamos tentar colocar a segunda rainha em outro lugar...

R

R

Problema Ops, as rainhas se atacam pela coluna! Vamos tentar colocar a segunda rainha em outro lugar...

R

R

Problema Ops, as rainhas se atacam pela linha! Em um tabuleiro NxN, devemos colocar N rainhas de modo que elas não se ataquem por linha, coluna ou diagonal!

R R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

R

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

R

R

R

R

Problema Construindo uma solução válida... As partes em vermelho não se pode colocar rainhas.

R

R

R

R

R

R

R

R

Solução Vamos resolver esse problema por backtracking... A ideia é colocar a primeira rainha em uma posição da primeira coluna, a segunda rainha em uma posição da segunda coluna, a terceira em uma posição da terceira coluna e assim por diante...

Cada rainha irá se movimentar na sua coluna para tentarmos achar a solução! Ao colocar uma rainha, é preciso verificar se elas se atacam. Se elas se atacarem, realiza-se um backtracking (volta para algum estado anterior) para tentar novamente de outra forma.

Solução Veja o tabuleiro 4x4:

Solução Coloca-se a primeira rainha numa posição da primeira coluna:

R

Solução Coloca-se a segunda rainha numa posição da segunda coluna: Ops, as rainhas se atacam, tenta colocar a segunda rainha em outra posição...

R R

Solução Ops, as rainhas se atacam, tenta colocar a segunda rainha em outra posição... Backtracking!

R

R

Solução Ops, as rainhas se atacam, tenta colocar a segunda rainha em outra posição... Backtracking!

R R

Solução Ops, as rainhas se atacam, tenta colocar a segunda rainha em outra posição... Backtracking!

R

R

Solução Legal, conseguimos colocar a segunda rainha de forma que as rainhas não se ataquem. Vamos tentar colocar a terceira rainha...

R

R

Solução Colocamos a terceira rainha na terceira coluna. Ops, as rainhas se atacam! Tenta colocar a terceira rainha em outra posição da terceira coluna.

R R

R

Solução Ops, as rainhas se atacam! Tenta colocar a terceira rainha em outra posição da terceira coluna.

R

R

R

Solução Ops, as rainhas se atacam! Tenta colocar a terceira rainha em outra posição da terceira coluna.

R

R R

Solução Ops, as rainhas se atacam! Não conseguimos , realizamos o backtracking...

R

R

R

Solução Mais backtracking...

R

R

Solução Tentamos uma posição diferente para a primeira rainha....

R

Solução Vamos colocar a segunda rainha... Ops, elas se atacam!

R

R

Solução Ops, elas se atacam novamente!

R R

Solução Ops, elas se atacam novamente!

R

R

Solução Ok, finalmente conseguimos colocar a segunda rainha!

R

R

Solução Vamos colocar a terceira... Legal!! Conseguimos colocar a terceira!

R

R

R

Solução Vamos colocar a quarta... Ops, elas se atacam....

R R

R

R

Solução Ops, elas ainda se atacam...

R

R R

R

Solução Legal!! Conseguimos colocar as 4 rainhas de forma que elas não se ataquem!

R

R

R

R

Algoritmo Já conseguimos visualizar algumas coisas que temos que fazer. Precisamos ter uma função para verificar se, ao colocar uma rainha numa determinada posição, nenhuma rainha se atacará, ou seja, verifica a linha, coluna e diagonais a partir da posição de onde iremos colocar a rainha.

Algoritmo Precisamos de uma função para gerar as soluções. “tab” é o tabuleiro, “N” é a dimensão e “col” é a coluna onde que vamos tentar inserir a nova rainha.

Implementação Código em C++:

◦ https://gist.github.com/marcoscastro/501e816d6bb42a104eba