30
José Augusto Baranauskas Departamento de Física e Matemática – FFCLRP-USP [email protected] http://dfm.ffclrp.usp.br/~augusto Algoritmos e Estruturas de Dados I Usando uma Pilha Usando uma Pilha Esta apresentação mostra o uso de retrocesso (backtracking) para resolver o problema das N-Rainhas usando uma pilha

Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

José Augusto BaranauskasDepartamento de Física e Matemática – FFCLRP-USP

[email protected]://dfm.ffclrp.usp.br/~augusto

Algoritmos eEstruturas de Dados I

Usando uma PilhaUsando uma Pilha

Esta apresentação mostra o uso de retrocesso (backtracking) para resolver o problema das N-Rainhas usando uma pilha

Page 2: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

2

O Problema das Oito RainhasO Problema das Oito Rainhas

Suponha que você tenha 8 rainhas de um jogo de xadrez......e um tabuleiro de xadrez

Page 3: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

3

O Problema das Oito RainhasO Problema das Oito Rainhas

As rainhas podem ser dispostas no tabuleiro de modo que duas rainhas não se ataquem?

Page 4: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

4

O Problema das Oito RainhasO Problema das Oito Rainhas

Duas rainhas não são permitidas na mesma linha...

Page 5: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

5

O Problema das Oito RainhasO Problema das Oito Rainhas

Duas rainhas não são permitidas na mesma linha, ou na mesma coluna...

Page 6: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

6

O Problema das Oito RainhasO Problema das Oito Rainhas

Duas rainhas não são permitidas na mesma linha, ou na mesma coluna, ou na mesma diagonal

Page 7: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

7

O Problema das N RainhasO Problema das N Rainhas

O número de rainhas e o tamanho do tabuleiro podem variar

N colunas

N linhas

N Rainhas

Page 8: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

8

O Problema das N RainhasO Problema das N Rainhas

Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas num tabuleiro N x N

Page 9: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

9

Como o Programa FuncionaComo o Programa Funciona

O programa usa uma pilha para guardar onde cada rainha é colocada

Page 10: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

10

Como o Programa FuncionaComo o Programa Funciona

Cada vez que o programa decide colocar uma rainha no tabuleiro, a posição da nova rainha é guardada em um registro que é colocado na pilha

ROW 1, COL 1

Page 11: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

11

Como o Programa FuncionaComo o Programa Funciona

Também temos um inteiro para guardar quantas linhas foram preenchidas até o momento (Filled) ROW 1, COL 1

1 Filled

Page 12: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

12

Como o Programa FuncionaComo o Programa Funciona

Cada vez que o programa decide colocar uma rainha no tabuleiro, a posição da nova rainha é guardada em um registro que é colocado na pilha...

ROW 1, COL 1

1 Filled

ROW 2, COL 1

Page 13: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

13

Como o Programa FuncionaComo o Programa Funciona

...se há conflito com outra rainha, mudamos a nova rainha para a próxima coluna à direita

ROW 1, COL 1

1 Filled

ROW 2, COL 2

Page 14: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

14

Como o Programa FuncionaComo o Programa Funciona

Se outro conflito acontece, a rainha é novamente mudada para a próxima coluna

ROW 1, COL 1

1 Filled

ROW 2, COL 3

Page 15: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

15

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 3

Quando não há mais conflitos, paramos e adicionamos 1 ao valor de Filled

Page 16: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

16

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 3

ROW 3, COL 1

Vamos olhar na terceira linha. A primeira posição que tentamos tem um conflito...

Page 17: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

17

Como o Programa FuncionaComo o Programa Funciona

...então mudamos para a coluna 2. Mas outro conflito surge...

ROW 1, COL 1

2 Filled

ROW 2, COL 3

ROW 3, COL 2

Page 18: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

18

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 3

ROW 3, COL 3

...e mudamos para a terceira coluna. Ainda há conflito...

Page 19: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

19

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 3

ROW 3, COL 4

...e mudamos para a coluna 4. Ainda há conflito nesta coluna, então tentamos mover a rainha novamente...

Page 20: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

20

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 3

ROW 3, COL 4

...mas não há mais lugar no tabuleiro

Page 21: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

21

Como o Programa FuncionaComo o Programa Funciona

Quando não temos mais espaço em uma linha:

Tiramos o topo da pilhaDecrementamosFilled em uma unidadeE continuamos trabalhando na linha anterior

ROW 1, COL 1

1 Filled

ROW 2, COL 3

Page 22: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

22

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

1 Filled

ROW 2, COL 4

Agora continuamos trabalhando na linha 2, mudando a rainha para a direita

Page 23: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

23

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 4

Esta posição não tem conflitos, então podemos incrementar Filled de 1, e mover para a rainha da linha 3

Page 24: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

24

Como o Programa FuncionaComo o Programa Funciona

ROW 1, COL 1

2 Filled

ROW 2, COL 4

ROW 3, COL 1

Na linha 3, começamos novamente pela primeira coluna

Page 25: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

25

PseudoPseudo--código para as Ncódigo para as N--RainhasRainhas

Crie uma pilha na qual cada decisão tomada será armazenadaPosicione a primeira rainha, inserindo sua posição na pilha e preenchendo Filled com zeroRepita estes passos

Se não há conflitos com as rainhas...Senão se há conflitos e há espaço no tabuleiro para colocar a rainha na próxima colunaSenão se há conflito e não há espaço para mover a rainha para a direita...

Page 26: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

26

PseudoPseudo--código para as Ncódigo para as N--RainhasRainhas

Repita estes passosSe não há conflitos com as rainhas...

Incremente Filled de 1. Se Filled é igual a N,então o algoritmo acabou. Senão mude

para a próxima linha e coloque a rainha na primeira coluna.

Page 27: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

27

PseudoPseudo--código para as código para as NN--RainhasRainhas

Repita estes passosSe não há conflitos com as rainhas...Senão se há conflito e há espaço no tabuleiro para mover a rainha...

Mova a rainha para a próxima coluna,ajustando o registro no topo da pilha

para indicar a nova posição

Page 28: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

28

PseudoPseudo--código para as código para as NN--RainhasRainhas

Repita estes passosSe não há conflitos com as rainhas...Senão se há conflito e há espaço no tabuleiro para mover a rainha...Senão se há conflito e não há espaço no tabuleiro para mover a rainha...

Volte! (Backtrack!)Continue tirando da pilha e reduzindo Filled

de 1 até chegar a uma linha onde a rainha possaser mudada para a próxima coluna. Mude-a.

Page 29: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

29

Pilhas têm muitas aplicaçõesA aplicação que mostramos é chamada backtracking (retrocesso)A chave para backtracking: cada escolha é guardada em um pilhaQuando você não tem mais opções para a decisão corrente, você tira o topo da pilha, e continua tentando diferentes escolhas para a decisão anterior

ResumoResumo

Page 30: Usando uma Pilhadcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-N-Rainhas.pdf · O Problema das N Rainhas Escreveremos um programa que tenta encontrar uma maneira de colocar N Rainhas

30

THE ENDTTHE HE EENDND

Presentation copyright 1995, The Benjamin/Cummings Publishing Company,For use with Data Structures and Other Objectsby Michael Main and Walter Savitch.

Some artwork in the presentation is used with permission from Presentation Task Force(copyright New Vision Technologies Inc) and Corel Gallery Clipart Catalog (copyrightCorel Corporation, 3G Graphics Inc, Archive Arts, Cartesia Software, Image ClubGraphics Inc, One Mile Up Inc, TechPool Studios, Totem Graphics Inc).

Students and instructors who use Data Structures and Other Objects are welcometo use this presentation however they see fit, so long as this copyright notice remainsintact.