Académique Documents
Professionnel Documents
Culture Documents
ndice
Introduo ..................................................................................................................................... 1
A abordagem de dividir e conquistar ............................................................................................ 1
Problema do tabuleiro defeituoso.................................................................................................. 3
Desenvolvimento do algoritmo ..................................................................................................... 7
Concluso .................................................................................................................................... 11
Introduo
Muitas vezes deparamos com problemas aparentemente de difcil resoluo, uma boa forma de
as solucionar dividindo em subproblemas mais simples, resolver os subproblemas e juntar as
solues obtendo a soluo do problema inicial, esta tcnica e conhecida por Dividir e conquistar.
Com este trabalho pretendemos, aplicar esta tcnica Dividir e Conquistar na resoluo do
problema do tabuleiro defeituoso.
Comeamos por fazer uma abordagem geral sobre o algoritmo, aplicando a um exemplo de fcil
compreenso, seguidamente fizemos o enquadramento do problema do tabuleiro defeituoso,
depois passamos a resoluo do problema aplicando o algoritmo Dividir e Conquistar,
seguidamente abordamos uma soluo de implementao do algoritmo.
MergeSort (A,p,r)
1: if p < r then
2: q = (p + r)/2
3: Mergesort(A,p,q)
4: Mergesort(A, q + 1,r)
5: Merge(A,p,q,r)
Figura 6
Figura 7
De maneira que podemos observar, que ficamos agora perante 16 pequenos problemas de fcil
resoluo. Obtendo uma soluo global (figura 8) do problema maior proposto inicialmente.
Figura 8
O algoritmo para resoluo do problema do tabuleiro defeituoso pode ser representado pelo
fluxograma da figura 9.
Para definio das reas do problema supomos que o problema seja um tabuleiro de tamanho J
colunas e I linhas onde inicialmente I=J=N=2k. Sendo assim temos valores de I linhas e J colunas
variando entre 1 e N.
Figura 10
A partir desses limites para a efetuar a diviso do problema inicial e quatro sub-problemas
menores, basta dividir as linhas e as colunas em duas partes iguais, conforme est ilustrada na
figura 10. Feita esta diviso obteremos quatro sub-problemas Q1, Q2, Q3 e Q4 delimitados pelos
valores da tabela 1.
P1
P2
Q1
Imin
Jmin
Imax/2
Jmax/2
Q2
Imin
Jmax/2+1
Imax/2
Jmax
Q3
Imax/2+1
Jmin
Imax
Jmax/2
Q4
Imax/2+1
Jmax/2+1
Imax
Jmax
Tabela 1
J com estes limites estabelecidos, para marcar o triomino central, primeiro verifica qua dos subproblemas ficou com o ponto defeituoso de seguida transforma-mos os restantes em tabuleiros
defeituosos, seguindo a seguinte lgica:
Q2
Imax/2
Jmax/2+1
Q3
Imax/2+1
Jmax/2
Q4
Imax/2+1
Jmax/2+1
PONTO NO Q1
TRIOMINO
Tabela 2-Ponto No Q1
TRIOMINO
Q1
Imax/2
Jmax/2
TRIOMINO
Q3
Imax/2+1
Jmax/2
Q4
Imax/2+1
Jmax/2+1
Tabela 3-PONTO NO Q2
Q1
Imax/2
Jmax/2
Q2
Imax/2
Jmax/2+1
Q4
Imax/2+1
Jmax/2+1
PONTO NO Q3
PONTO NO Q2
Tabela 4- Ponto No Q3
Q1
Imax/2
Jmax/2
Q2
Imax/2
Jmax/2+1
Q3
Imax/2+1
Jmax/2
PONTO NO Q4
TRIOMINO
Tabela 5-Ponto No Q4
Desenvolvimento do algoritmo
O programa possui um menu com 4 opes (figura 11), a primeira recebe o parmetro K que
define o tamanho do tabuleiro, a segunda opo a opo de debugging que quando est ativo
nos mostra os passos do preenchimento da matriz e a opo de Resultado que d inicio ao calculo
e exibio da matriz na tela.
Resultado
Figura 12
Para isso criamos uma classe ChessBoard, onde foi necessrio trs atributos: N que o tamanho
do tabuleiro, debug que nos avisa se para fazer o debug e a Matriz (tabuleiro) que um vector
de vector para inteiros que conforme o valor do atributo a K ser definido o tamanho do vector.
Figura 13
Temos o mtodo dividirConquistar que recursivamente vai dividindo o tabuleiro em quatro partes
iguais at o problema for trivialmente resolvel.
void ChessBoard::dividirConquistar(int iMin,int iMax,int jMin,int jMax,int posicao){
/* verifica se a soluo trivialmente resolvel */
if((iMax-iMin)==1){ /* se for verdade porque a matrix j de tamanho 2x2 */
/* preenche todas as clulas a volta do triomino com o valor do parmetro posicao */
for(int i=iMin-1;i<iMax;i++)
for(int j=jMin-1;j<jMax;j++)
if(matriz[i][j]==0) matriz[i][j]=posicao;
if(debug == 1) imprime(); /* impime se o debugin estiver activo*/
return ;
}
// caso ainda for possvel a diviso ento verificado a clula que est preenchida e feito o
preenchimento do triomino com metodo marcaTriomino
//marca o triominio central
marcaTriomino( iMin, iMax, jMin, jMax,verificaPonto( iMin, iMax, jMin, jMax));
return;
O mtodo
retorno da funo verificaPonto que nos d o quadrante em que a clula esta preenchida, faz a
diviso da matriz em 4 quadrantes e preenche o triomino como nos mostra a seguir
switch(posicaoPonto){
case 1:
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2]=trioCont;//Q2
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2-1]=trioCont;//Q3
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2]=trioCont;//Q4
break;
case 2:
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2-1]=trioCont;//Q1
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2-1]=trioCont;//Q3
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2]=trioCont;//Q4
break;
case 3:
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2-1]=trioCont;//Q1
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2]=trioCont;//Q2
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2]=trioCont;//Q4
break;
case 4:
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2-1]=trioCont;//Q1
matriz[(iMin-1+iMax)/2-1][(jMin-1+jMax)/2]=trioCont;//Q2
matriz[(iMin-1+iMax)/2][(jMin-1+jMax)/2-1]=trioCont;//Q3
break;
}
O programa inicializa toda a matriz a 0 e faz o preenchimento da clula aleatoriamente com -1
com mtodo - void solucaoLimpa(int k);
O cdigo vai dividindo a matriz sempre em quatro partes iguais at chegar a de 2x2
automaticamente vai preenchendo os triominos como nos mostra a figura 14.
Figura 14
Concluso
O presente trabalho pretendeu entender a importncia do uso de tcnicas heursticas na
implementao de algoritmos para resoluo de problemas computacionais complexos. Porem
um algoritmo s eficiente se houver uma utilizao otimizada dos recursos computacionais na
resoluo de um determinado problema.
Conclumos que o algoritmo dividir e conquistar, demonstrou ser uma boa soluo na resoluo
do problema do tabuleiro defeituoso e com a sua devida implementao e otimizao pode-se
obter bons resultados.
Bibliografia
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest e Clifford Stein - Algoritmos: teoria
e prtica, traduo da 2 edio [americana], Vandenberg D. de Souza, Ed. Campus, 2002. ISBN
85-352-0926-3.