Baixe o app para aproveitar ainda mais
Prévia do material em texto
José Augusto Baranauskas Departamento de Computação e Matemática – FFCLRP-USP augusto@usp.br http://dcm.ffclrp.usp.br/~augusto Algoritmos e Estruturas 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 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 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? 4 O Problema das Oito RainhasO Problema das Oito Rainhas �Duas rainhas não são permitidas na mesma linha... 5 O Problema das Oito RainhasO Problema das Oito Rainhas �Duas rainhas não são permitidas na mesma linha, ou na mesma coluna... 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 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 l i n h a s 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 9 Como o Programa FuncionaComo o Programa Funciona O programa usa uma pilha para guardar onde cada rainha é colocada 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 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 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 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 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 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 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... 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 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... 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... 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 21 Como o Programa FuncionaComo o Programa Funciona Quando não temos mais espaço em uma linha: �Tiramos o topo da pilha �Decrementamos Filled em uma unidade �E continuamos trabalhando na linha anterior ROW 1, COL 1 1 Filled ROW 2, COL 3 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 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 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 25 PseudoPseudo--ccóódigo para as Ndigo para as N--RainhasRainhas �Crie uma pilha na qual cada decisão tomada será armazenada �Posicione a primeira rainha, inserindo sua posição na pilha e preenchendo Filled com zero �Repita 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 coluna � Senão se há conflito e não há espaço para mover a rainha para a direita... 26 PseudoPseudo--ccóódigo para as Ndigo para as N--RainhasRainhas �Repita estes passos � Se 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. 27 PseudoPseudo--ccóódigo para as digo para as NN--RainhasRainhas �Repita estes passos � Se 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 28 PseudoPseudo--ccóódigo para as digo para as NN--RainhasRainhas �Repita estes passos � Se 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 possa ser mudada para a próxima coluna. Mude-a. 29 �Pilhas têm muitas aplicações �A aplicação que mostramos é chamada backtracking (retrocesso) �A chave para backtracking: cada escolha é guardada em um pilha �Quando 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 30 THE ENDTTHE HE EENDND Presentation copyright 1995, The Benjamin/Cummings Publishing Company, For use with Data Structures and Other Objects by 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 (copyright Corel Corporation, 3G Graphics Inc, Archive Arts, Cartesia Software, Image Club Graphics Inc, One Mile Up Inc, TechPool Studios, Totem Graphics Inc). Students and instructors who use Data Structures and Other Objects are welcome to use this presentation however they see fit, so long as this copyright notice remains intact. Translation to portuguese by Prof. Maria Carolina Monard, USP. Modifications for C++ language by Prof. José Augusto Baranauskas, USP, 2005.
Compartilhar