algoritmos

13

Click here to load reader

Upload: api-3697274

Post on 13-Nov-2014

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algoritmos

1

11

Diseño de AlgoritmosDiseño de Algoritmos

TTéécnicas de Programacicnicas de ProgramacióónnGabriel HuecasGabriel Huecas

22

ÍndiceÍndice

Algoritmos ávidosAlgoritmos ávidos

Dividir y vencerDividir y vencer

Programación dinámicaProgramación dinámica

Retroceso (Retroceso (backtrackingbacktracking))

33

Algoritmos ÁvidosAlgoritmos Ávidos

Algoritmos ávidosAlgoritmos ávidosProblema del cambio mínimo:Problema del cambio mínimo:monedas de 25, 10, 5, 1.monedas de 25, 10, 5, 1.Devolver 63 con nº mínimo de monedas:Devolver 63 con nº mínimo de monedas:

63 63 -- 25 = 38 25 = 38 -- 25 = 13 25 = 13 -- 10 = 3 10 = 3 -- 1 = 2 1 = 2 -- 1 = 1 = 1 1 -- 1 = 01 = 0Varias fasesVarias fases

En cada fase se toma una decisión óptima, sin En cada fase se toma una decisión óptima, sin pensar en el futuropensar en el futuro

44

Algoritmos ÁvidosAlgoritmos Ávidos

La solución puede no ser óptima (la mejor) La solución puede no ser óptima (la mejor) pero es “óptimo local”.pero es “óptimo local”.

monedas de 11, 5 y 1.monedas de 11, 5 y 1.cambio de 15 =>cambio de 15 =>15 15 -- 11 = 4 11 = 4 -- 1 = 3 1 = 3 -- 1 = 2 1 = 2 -- 1 = 1 1 = 1 -- 1 = 01 = 0Solución: 1 de 11 y 4 de 1.Solución: 1 de 11 y 4 de 1.Óptimo: 3 de 5.Óptimo: 3 de 5.

Page 2: Algoritmos

2

55

Problema del Agente ViajeroProblema del Agente Viajero“Recorrer una serie de ciudades con coste mínimo”“Recorrer una serie de ciudades con coste mínimo”

Recorrido: ciclo simple que incluya todos los Recorrido: ciclo simple que incluya todos los vértices una sola vezvértices una sola vez

CICLO DE HAMILTONCICLO DE HAMILTONGrafo: Grafo:

Vértices = ciudadesVértices = ciudadesArístasArístas = viaje entre ciudades= viaje entre ciudadesPeso = coste de viajar de una ciudad a otra (peso de Peso = coste de viajar de una ciudad a otra (peso de una arista)una arista)

Grafo no dirigido:Grafo no dirigido:Coste (A Coste (A →→ B) = Coste (B B) = Coste (B →→ A)A)

66

EjemploEjemplo

(0,0)A

(4,3)B

(1,7)C (15,7)D

(15,4)E

(18,0)F

77

Posible solucionesPosible soluciones

88

Variante del Algoritmo de Variante del Algoritmo de KruskalKruskal::Def.Def.-- Grado de un vértice: nº de aristas conectadas Grado de un vértice: nº de aristas conectadas a dicho vérticea dicho vérticeSe van seleccionando las aristas más cortas, Se van seleccionando las aristas más cortas, siempre quesiempre que

no haga que un vértice tenga grado 3no haga que un vértice tenga grado 3no forme ciclo, excepto que el nº de aristas seleccionadas no forme ciclo, excepto que el nº de aristas seleccionadas sea igual al nº de vértices sea igual al nº de vértices ⇒⇒ EXCEPTO QUE SEA LA EXCEPTO QUE SEA LA ÚLTIMAÚLTIMA

Page 3: Algoritmos

3

99

Matriz de conectividadMatriz de conectividad

LongitudesLongitudes

--FF55--EE

7,627,6233--DD18,4018,4014,314,31414--CC14,3014,30111111,711,755--BB

181815,515,516,616,67,087,0855--AAFFEEDDCCBBAA

1010

Posible solucionesPosible soluciones

5050

4949’’7878

4949’’7070

4848’’3838

1111

Dividir y VencerDividir y Vencer

Dividir: en problemas más pequeños, resueltos Dividir: en problemas más pequeños, resueltos recursivamenterecursivamente

Excepto los caso baseExcepto los caso base

Vencer: la solución al problema original se Vencer: la solución al problema original se forma en base a las soluciones de los forma en base a las soluciones de los subproblemassubproblemas

1212

MergeSortMergeSort

Ordenación por IntercalaciónOrdenación por Intercalación

intercalarintercalar

==

++

ordenarordenar

1113132424 2626

ordenarordenar

221515 27273838

1113132424 2626 221515 27273838

ordenarordenar

Page 4: Algoritmos

4

1313

MergeSortMergeSort: intercalación (I): intercalación (I)

1113132424 2626 221515 27273838

1113132424 2626 221515 27273838

2424131311 2626 151522 38382727posIposI posDposD posTmpposTmp

2424131311 2626 151522 38382727 11posIposI posDposD posTmpposTmp

2424131311 2626 151522 38382727 2211posIposI posDposD posTmpposTmp

1414

MergeSortMergeSort: intercalación (II): intercalación (II)

2424131311 2626 151522 38382727 13132211posIposI posDposD posTmpposTmp

2424131311 2626 151522 38382727 13132211 1515posIposI posDposD posTmpposTmp

2424131311 2626 151522 38382727 13132211 1515 2424posIposI posDposD posTmpposTmp

2424131311 2626 151522 38382727 13132211 1515 26262424posIposI posDposD posTmpposTmp

1515

MergeSortMergeSort: intercalación (III): intercalación (III)

Se copia el resto del segundo Se copia el resto del segundo arrayarray en destinoen destino

2424131311 2626 151522 38382727 13132211 1515 26262424 38382727posIposI posDposD posTmpposTmp

1616

ImplementaciónImplementación (I)(I)class class mergeSortmergeSort {{

public static void main (String public static void main (String argsargs[]) {[]) {

Random r= new Random();Random r= new Random();

intint pruebaprueba[]= new int[20];[]= new int[20];

for (for (intint i= 0; i < i= 0; i < prueba.lengthprueba.length; i++); i++)

prueba[iprueba[i]= ]= r.nextIntr.nextInt() % 100;() % 100;

System.out.println("ElSystem.out.println("El array array inicialinicial eses:");:");

for (for (intint i= 0; i < i= 0; i < prueba.lengthprueba.length; i++); i++)

System.out.println(prueba[iSystem.out.println(prueba[i] + " ");] + " ");

mergeSort(pruebamergeSort(prueba););

System.out.println("ElSystem.out.println("El array array despuésdespués de de ordenarordenar eses:");:");

for (for (intint i= 0; i < i= 0; i < prueba.lengthprueba.length; i++); i++)

System.out.println(prueba[iSystem.out.println(prueba[i] + " ");] + " ");

}}

}}

Page 5: Algoritmos

5

1717

ImplementaciónImplementación (II)(II)public static void public static void mergeSortmergeSort ((intint A[]) {A[]) {mergeSortmergeSort (A, 0, A.length(A, 0, A.length--1);1);

}}

private static void private static void mergeSortmergeSort((intint A[], A[], intint izqizq, , intint derder) {) {

if (if (izqizq < < derder) {) {intint centrocentro= (= (izqizq + + derder) / 2;) / 2;mergeSort(AmergeSort(A, , izqizq, , centrocentro););mergeSort(AmergeSort(A, centro+1, , centro+1, derder););merge(Amerge(A, , izqizq, centro+1, , centro+1, derder););

}}}}

1818

ImplementaciónImplementación (III)(III)private static void mergeprivate static void merge

((intint A[], A[], intint posIposI, , intint posDposD, , intint derder) {) {intint AtmpAtmp[]= new []= new int[derint[der -- posI+1];posI+1];intint beginIbeginI= = posIposI;;intint izqizq= = posDposD -- 1;1;intint posTmpposTmp= 0;= 0;

while ( (while ( (posIposI <= <= izqizq) && () && (posDposD <= <= derder) ) {) ) {if (if (A[posIA[posI] < ] < A[posDA[posD]) {]) {

Atmp[posTmpAtmp[posTmp] = A [] = A [posIposI];];posIposI++;++;

} else {} else {Atmp[posTmpAtmp[posTmp] = A [] = A [posDposD];];posDposD++;++;

}}posTmpposTmp++;++;

}}

1919

ImplementaciónImplementación (IV)(IV)// // copiamoscopiamos el el restoresto del array del array queque quedequedefor (for (intint i= 0; i <= i= 0; i <= izqizq--posIposI; i++); i++)

Atmp[posTmp+iAtmp[posTmp+i]= ]= A[posI+iA[posI+i];];for (for (intint i= 0; i <= i= 0; i <= derder--posDposD; i++); i++)

Atmp[posTmp+iAtmp[posTmp+i]= ]= A[posD+iA[posD+i];];

// // pasamospasamos al array originalal array originalfor (for (intint i= 0; i < i= 0; i < Atmp.lengthAtmp.length; i++); i++)

A[beginIA[beginI + i]= + i]= Atmp[iAtmp[i];];}}

2020

Torres de HanoiTorres de Hanoi

Problema: pasar n disco de A a CProblema: pasar n disco de A a CSolución:Solución:

Pasar nPasar n--1 discos de A a B1 discos de A a BPasar 1 disco de A a CPasar 1 disco de A a CPasar nPasar n--1 discos de B a C1 discos de B a C

B CA

Page 6: Algoritmos

6

2121

Multiplicar 2 enteros X e Y de n bits (o dígitos)Multiplicar 2 enteros X e Y de n bits (o dígitos)Algoritmo enseñado en básica requiere n productos Algoritmo enseñado en básica requiere n productos parciales de tamaño n parciales de tamaño n --> > O(nO(n22))Simplificación: n potencia de 2Simplificación: n potencia de 2Separamos X e Y en n/2 bits:Separamos X e Y en n/2 bits:X = X = A·2A·2nn/2/2 + B Y = + B Y = C·2C·2nn/2/2 + D+ DX·Y=X·Y= A·C·2A·C·2nn + (+ (AA··D+BD+B··CC))·2·2nn/2/2+ + BB··DD

4 multiplicaciones de n/2 bits4 multiplicaciones de n/2 bits3 sumas3 sumas2 desplazamientos de 22 desplazamientos de 2nn y 2y 2n/2n/2

2222

EjemploEjemploX = 61438521 Y = 94736407 X = 61438521 Y = 94736407 X·Y=X·Y= 58204647309340475820464730934047A = 6143 B = 8521 C = 9473 D = 6407A = 6143 B = 8521 C = 9473 D = 6407X = A·10X = A·1044 + B Y = C·10+ B Y = C·1044 + D+ DX·Y= A·C·10X·Y= A·C·1088 + (A·D + B·C)·10+ (A·D + B·C)·1044 + B·D+ B·DX = 6143 Y = 9473X = 6143 Y = 9473A = 61 B = 43 C = 94 D = 73A = 61 B = 43 C = 94 D = 73A·C = 5734 A·D = 4453 A·C = 5734 A·D = 4453 B·CB·C = 4042 B·D = 3139= 4042 B·D = 3139A·D+B·CA·D+B·C = 8495= 8495

A·B·10A·B·1044 57 350 00057 350 000(A·D+B·C)·10(A·D+B·C)·1022 849 500849 500B·DB·D 3 1393 139

------------------

58 192 63958 192 639

2323

ImplementaciónImplementaciónintint multmult ((intint X, X, intint Y, Y, intint n) { // n: número de bitsn) { // n: número de bitsifif (n == 1) {(n == 1) {

returnreturn ((X == 1) & (Y == 1));((X == 1) & (Y == 1));} } elseelse {{

intint A = n/2 bits izq. X;A = n/2 bits izq. X;intint B = n/2 bits der. X;B = n/2 bits der. X;intint C = n/2 bits izq. Y;C = n/2 bits izq. Y;intint D = n/2 bits der. Y;D = n/2 bits der. Y;

intint m1 = m1 = multmult (A, C, n / 2);(A, C, n / 2);intint m2 = m2 = multmult (A, D, n / 2);(A, D, n / 2);intint m3 = m3 = multmult (B, C, n / 2);(B, C, n / 2);intint m4 = m4 = multmult (B, D, n / 2);(B, D, n / 2);

returnreturn m1 * 2m1 * 2^n^n + (m2+ (m2+m3+m3)*2^(n/2) + m4;)*2^(n/2) + m4;}}

2424

Programación DinámicaProgramación Dinámica

Algoritmos recursivos con cálculos repetitivosAlgoritmos recursivos con cálculos repetitivos

Almacenar valores intermedios en una tablaAlmacenar valores intermedios en una tablavariable globalvariable globalinicializacióninicializaciónregistro de valor la primera vezregistro de valor la primera vez

Page 7: Algoritmos

7

2525

FibonacciFibonacci recursivorecursivo

public long fib (int n) throws Exception {

if (n < 0) throw new Exception (“Pues si que...”);

if ( (n = 0) || (n = 1) )

return 1;

else

return fib (n-1) + fib (n-2);

}

⎩⎨⎧

>−+−=

=1)2()1(1,01

)(nnfnf

nnf

2626

Complejidad Complejidad FibonacciFibonacci

F6F5

F4F3

F2F1 F0

F1F2

F1 F0

F3F2

F1 F0F1

F4F3

F2F1 F0

F1F2

F1 F0

2727

FibonacciFibonacci iterativoiterativopublic long fib (int n) throws Exception {

long ult, penult, res;if (n < 0) throw new Exception (“Pues si que...”);

if ( (n = 0) || (n = 1) )return 1;

ult = penult = 1;for (int i = 2; i <= n; i++) {

res = ult + penult;penult = ult;ult = res;

}return res;

}

2828

Problema de la TriangulaciónProblema de la Triangulación

Dados los vértices de un polígono y las Dados los vértices de un polígono y las distancias entre vértices, hallar la triangulación distancias entre vértices, hallar la triangulación mínima.mínima.Triangulación:Triangulación:

Conjunto de cuerdas que no se cruzan entre si, Conjunto de cuerdas que no se cruzan entre si, entre vértices no adyacentes, de forma que el entre vértices no adyacentes, de forma que el polígono queda dividido en triángulospolígono queda dividido en triángulos

Mínimo:Mínimo:La suma de la longitud de dichas cuerdas debe ser La suma de la longitud de dichas cuerdas debe ser mínima.mínima.

Page 8: Algoritmos

8

2929

RepresentaciónRepresentación

Polígono de n vérticesPolígono de n vérticesvv00,...,,...,vvnn--11 en sentido horarioen sentido horario

(8,26)(8,26) vv22

(10,0)(10,0)vv66

(15,26)(15,26)vv33

(22,12)(22,12)vv55

(27,21)(27,21)vv44

(0,20(0,20)) vv11

(0,10)(0,10)vv00

aristaarista

cuerdacuerda

3030

Sabemos que…Sabemos que…

Hecho 1: el par vHecho 1: el par vii y vy vi+1i+1 es tocado, al menos, es tocado, al menos, por una cuerda.por una cuerda.Hecho 2: sea (vHecho 2: sea (vii, , vvjj) una cuerda de cualquier ) una cuerda de cualquier triangulación. Entonces existe triangulación. Entonces existe vvkk tal que (tal que (vvii,v,vkk), ), ((vvkk, , vvjj) son aristas o cuerdas.) son aristas o cuerdas.

Demostración: De otra forma, vDemostración: De otra forma, vii y vy vi+1i+1 podría podría limitar una región no triangular.limitar una región no triangular.

3131

SoluciónSolución

Para empezar la búsqueda, se cogen dos vértices Para empezar la búsqueda, se cogen dos vértices adyacentes (vadyacentes (v00, v, v11).).Debe existir Debe existir vvkk tal que (vtal que (v11, , vvkk) y () y (vvkk,v,v00) sean cuerdas o ) sean cuerdas o aristas en la triangulación.aristas en la triangulación.

Se prueban todos los Se prueban todos los vvkk (k # 0, #1)(k # 0, #1)Con n vértices, tendremos nCon n vértices, tendremos n--2 selecciones.2 selecciones.Se examina cada selección.Se examina cada selección.

3232

Solución recursivaSolución recursiva

Quedan dos Quedan dos subproblemassubproblemas, por ejemplo , por ejemplo eligiendo v3eligiendo v3

vv22vv33

vv11

vv00

vv66

vv33

vv55

vv44

vv00

Page 9: Algoritmos

9

3333

SSisis subproblemasubproblema de tamaño s a partir del vértice vde tamaño s a partir del vértice vii

vvii , v, vi+1i+1,..., v,..., vi+si+s--11 => s vértices=> s vértices(v(vii ,v,vi+si+s--11) >= cuerda) >= cuerda

Opciones para solución de Opciones para solución de SSisis1. coger v1. coger vi+si+s--11, formar el triángulo (v, formar el triángulo (vii, v, vi+si+s--11), (v), (vii, v, vi+si+s--22) y ) y

(v(vi+si+s--22,v,vi+si+s--11) y resolver S) y resolver Si,si,s--112. coger v2. coger vi+1i+1, formar el triángulo (v, formar el triángulo (vii, v, vi+si+s--11), (v), (vi+1i+1, v, vi+si+s--11) y ) y

((vvii,v,vi+1i+1) y resolver S) y resolver Si+1,si+1,s--113. k entre 2 y s3. k entre 2 y s--3,coger v3,coger vi+ki+k, formar el triángulo (v, formar el triángulo (vii, v, vi+ki+k), ),

(v(vi+ki+k, v, vi+si+s--11) y (v) y (vii,v,vi+si+s--11) y resolver S) y resolver Si,k+1i,k+1 y Sy Si+k,si+k,s--kk

3434

Los problemas SLos problemas Si3i3 no hay que “resolverlos”no hay que “resolverlos”

Problemas repetidosProblemas repetidos33ss--44 llamadas recursivas (sin “resolver” Sllamadas recursivas (sin “resolver” Si3i3))

vv66

vv33

vv55

vv44

vv00

vv66

vv33

vv55

vv44

vv00

3535

Solución eficiente: calcular coste Solución eficiente: calcular coste CCisis de la de la triangulación triangulación SSisis

CCisis = C (= C (SSisis))CCisis = = minmin [C[Ci,k+1i,k+1 + Ci+k,s+ Ci+k,s--k + k +

D(vD(vii,v,vi+ki+k) + D(v) + D(vi+ki+k,v,vi+si+s--11)] 1 )] 1 ≤≤ k k ≤≤ ss--22

•• para s para s ≥≥ 4 en orden (S=4,5,...,n4 en orden (S=4,5,...,n--1)1)•• SSisis = 0= 0 para s < 4para s < 4

( ) ( )Dlong

v , vv , v si v , v no son adyacentes

si v , v son adyacentesp qp q p q

p q=⎧⎨⎩0

3636

EjemploEjemplo

EjemploEjemploCC6565 = = minmin [C[C6,2 6,2 + C+ C0,4 0,4 +D(v+D(v66,v,v00) + D(v) + D(v00,v,v33),),

1 1 ≤≤ k k ≤≤ ss--22 CC6,3 6,3 + C+ C1,3 1,3 +D(v+D(v66,v,v11) + D(v) + D(v11,v,v33),),CC6,4 6,4 + C+ C2,2 2,2 +D(v+D(v66,v,v22) + ) + D(vD(v22,v,v33)])]

665544332211i=0i=0ss

CC6464=17.89=17.89CC5454=22.69=22.69CC4444=22.69=22.69CC3434=15.65=15.65CC2424=15.65=15.65CC1414=16.16=16.16CC0404=16.16=16.1644

CC6565=38.09=38.09CC5555=39.98=39.98CC4545=45.50=45.50CC3535=37.74=37.74CC2525=35.49=35.49CC1515=31.81=31.81CC0505=37.54=37.5455

CC6666=63.62=63.62CC5656=59.78=59.78CC4646=59.78=59.78CC3636=64.69=64.69CC2626=57.58=57.58CC1616=55.22=55.22CC0606=53.54=53.5466

CC0707=75.43=75.4377

Page 10: Algoritmos

10

3737

D(vD(v66,v,v00) = 0 (arista)) = 0 (arista)D(vD(v00,v,v33) = 21.93) = 21.93D(vD(v66,v,v11) = 22.36) = 22.36D(vD(v11,v,v33) = 16.16) = 16.16D(vD(v66,v,v22) = 26.08) = 26.08D(vD(v22,v,v33) = 0 (arista)) = 0 (arista)CC6565 = = minmin [0 + 16.16[0 + 16.16 + 0 + 21.93,+ 0 + 21.93,

00 + 0+ 0 + 22.36 + 16.16,+ 22.36 + 16.16,17.8917.89 + 0 + 26.08 + 0] =+ 0 + 26.08 + 0] =

minmin [38.19, 38.52, 43.97] = 38.19[38.19, 38.52, 43.97] = 38.19Al incluir este valor en la tabla, es conveniente indicar las Al incluir este valor en la tabla, es conveniente indicar las cuerdas que produjeron esta triangulación mínima.cuerdas que produjeron esta triangulación mínima. 3838

Retroceso (Retroceso (BacktrackingBacktracking))Problemas sin una solución analítica o algorítmica:Problemas sin una solución analítica o algorítmica:

Hay que hacer una búsqueda exhaustiva del espacio de Hay que hacer una búsqueda exhaustiva del espacio de posibilidadesposibilidades

Y elegimos la buenaY elegimos la buena

Complejidad computacional alta: producto cartesiano Complejidad computacional alta: producto cartesiano de posibilidades para construir cada candidato a de posibilidades para construir cada candidato a solución solución

PERO se puede aprovechar parte de la solución anterior para PERO se puede aprovechar parte de la solución anterior para construir la nuevaconstruir la nueva

Decisiones parcialesDecisiones parciales

3939

AplicacionesAplicaciones

Problemas NPProblemas NP--completoscompletosSin solución analíticaSin solución analítica

Pintar un mapa con cuatro colores sin que dos Pintar un mapa con cuatro colores sin que dos países fronterizos tengan el mismo colorpaíses fronterizos tengan el mismo colorObtención de mejor jugadaObtención de mejor jugada

Tres en raya, damas, ajedrez (Tres en raya, damas, ajedrez (+poda+poda alfaalfa--beta)beta)

Etc.Etc.

4040

Ejemplo: 8 reinas en tableroEjemplo: 8 reinas en tablero

Poner 8 reinas en un tablero de ajedrez (8x8) Poner 8 reinas en un tablero de ajedrez (8x8) sin que se den jaque.sin que se den jaque.Debemos probar todas las posibilidadesDebemos probar todas las posibilidades

Cada reina puede estar en cualquiera de las Cada reina puede estar en cualquiera de las casillas: 64casillas: 6488 posibles combinacionesposibles combinaciones

Algo menos, las reinas no puedes estar en la misma Algo menos, las reinas no puedes estar en la misma casillacasilla

Page 11: Algoritmos

11

4141

Modelado de CasillaModelado de Casillapublicpublic enumenum Casilla {Casilla {

VACIA, Reina, Rey, Torre, Alfil, Caballo, VACIA, Reina, Rey, Torre, Alfil, Caballo, PeonPeon;;

publicpublic StringString toStringtoString() {() {

switch(thisswitch(this) {) {

case VACIA : case VACIA : returnreturn " ";" ";

case Reina : case Reina : returnreturn "r";"r";

case Rey : case Rey : returnreturn "R";"R";

case Torre : case Torre : returnreturn "t";"t";

case Caballo: case Caballo: returnreturn "c";"c";

case Alfil : case Alfil : returnreturn "a";"a";

case case PeonPeon : : returnreturn "p";"p";

}}

throwthrow newnew AssertionErrorAssertionError("Casilla desconocida " + ("Casilla desconocida " + thisthis););

}}

}} 4242

Modelado de Tablero (I)Modelado de Tablero (I)publicpublic classclass Tablero {Tablero {

intint widthwidth, , heightheight;;

Casilla tablero[][];Casilla tablero[][];

Tablero (Tablero (intint w, w, intint h) {h) {

width=width= w;w;

height=height= h;h;

tablero=tablero= newnew Casilla[wCasilla[w][h];][h];

forfor ((intint i=i= 0; i < 0; i < widthwidth; ; i++i++))

forfor ((intint j=j= 0; j < 0; j < heightheight; ; j++j++))

tablero[itablero[i][j]= ][j]= Casilla.VACIACasilla.VACIA;;

}}

4343

Modelado de Tablero (II)Modelado de Tablero (II)voidvoid imprime() {imprime() {

forfor ((intint i=i= 0; i < 0; i < widthwidth; ; i++i++) {) {

System.out.printlnSystem.out.println("("----------------------------------");");

System.out.printSystem.out.print("|");("|");

forfor ((intint j=j= 0; j < 0; j < heightheight; ; j++j++) {) {

System.out.print(tablero[iSystem.out.print(tablero[i][j] + "|");][j] + "|");

}}

System.out.printlnSystem.out.println();();

}}

System.out.printlnSystem.out.println("("----------------------------------");");

}}

publicpublic voidvoid pon(intpon(int i, i, intint j, Casilla pieza) {j, Casilla pieza) {

tablero[itablero[i][j]= pieza;][j]= pieza;

}}

publicpublic Casilla Casilla dame(intdame(int i, i, intint j) {j) {

returnreturn tablero[itablero[i][j];][j];

}}

4444

Cada reina en una columnaCada reina en una columnapublicpublic staticstatic booleanboolean ponReinasponReinas (Tablero t, (Tablero t, intint SizeSize, , intint n) {n) {

forfor ((intint j0= 0; j0 < j0= 0; j0 < SizeSize; j0++) {; j0++) {

t.pont.pon (0, j0, (0, j0, Figura.ReinaFigura.Reina););

forfor ((intint j1= 0; j1 < j1= 0; j1 < SizeSize; j1++) {; j1++) {

t.pont.pon (1, j1, (1, j1, Figura.ReinaFigura.Reina););

......

forfor ((intint j7= 0; j7 < j7= 0; j7 < SizeSize; j7++) {; j7++) {

t.pont.pon (7, j7, (7, j7, Figura.ReinaFigura.Reina););

ifif ( ! ( ! estanTodasEnJaqueestanTodasEnJaque (t, (t, SizeSize) )) )

returnreturn truetrue;;

t.pont.pon (7, j7, (7, j7, Figura.VACIAFigura.VACIA););

}}

......

}}

t.pont.pon (1, j1, (1, j1, Figura.VACIAFigura.VACIA););

}}

t.pont.pon (0, j0, (0, j0, Figura.VACIAFigura.VACIA););

}}

returnreturn falsefalse;;

}}

Page 12: Algoritmos

12

4545

No insistir en los erroresNo insistir en los errores

Poner N reinas es colocar una en una posición Poner N reinas es colocar una en una posición libre de jaque e intentar poner Nlibre de jaque e intentar poner N--1 reinas1 reinas

Cada vez que ponemos una reina, comprobamos Cada vez que ponemos una reina, comprobamos que no está en jaque con las demásque no está en jaque con las demásSi lo está, pasamos a la siguiente posiciónSi lo está, pasamos a la siguiente posiciónSi se agotan las posiciones, devolvemos Si se agotan las posiciones, devolvemos falsefalse (no (no pudimos colocar la reina)pudimos colocar la reina)

4646

estanEnJaqueestanEnJaquepublicpublic staticstatic booleanboolean estanEnJaqueestanEnJaque

(Tablero t, (Tablero t, intint SizeSize, , intint x, x, intint y) {y) {// compruebo fila// compruebo filaforfor ((intint i=i= 0; i < 0; i < SizeSize; ; i++i++) {) {

ifif (i == x) (i == x) continuecontinue; // la misma pieza; // la misma piezaifif ((t.dame(it.dame(i, y) != , y) != Casilla.VACIACasilla.VACIA))

returnreturn truetrue;;}}

// compruebo columna// compruebo columnaforfor ((intint j=j= 0; j < 0; j < SizeSize; ; j++j++) {) {

ifif (j == y) (j == y) continuecontinue; // la misma pieza; // la misma piezaifif ((t.dame(xt.dame(x, j) != , j) != Casilla.VACIACasilla.VACIA))

returnreturn truetrue;;}}

4747

estanEnJaqueestanEnJaque// comprueba diagonal// comprueba diagonalforfor ((intint i=i= x+1x+1, j = , j = y+1y+1; (i < ; (i < SizeSize) && (j < ) && (j < SizeSize); ); i++i++, , j++j++) {) {

ifif ( ( t.dame(it.dame(i, j) != , j) != Casilla.VACIACasilla.VACIA ))returnreturn truetrue;;

}}// comprueba diagonal// comprueba diagonalforfor ((intint i=i= x+1x+1, j = y, j = y--1; (i < 1; (i < SizeSize) && (j >= 0); ) && (j >= 0); i++i++, j, j----) {) {

ifif ( ( t.dame(it.dame(i, j) != , j) != Casilla.VACIACasilla.VACIA ))returnreturn truetrue;;

}}// comprueba diagonal// comprueba diagonalforfor ((intint i=i= xx--1, j = 1, j = y+1y+1; (i >= 0) && (j < ; (i >= 0) && (j < SizeSize); i); i----, , j++j++) {) {

ifif ( ( t.dame(it.dame(i, j) != , j) != Casilla.VACIACasilla.VACIA ))returnreturn truetrue;;

}}// comprueba diagonal// comprueba diagonalforfor ((intint i=i= xx--1, j = y1, j = y--1; (i >= 0) && (j >= 0); i1; (i >= 0) && (j >= 0); i----, j, j----) {) {

ifif ( ( t.dame(it.dame(i, j) != , j) != Casilla.VACIACasilla.VACIA ))returnreturn truetrue;;

}}returnreturn falsefalse;;

4848

ponReinasponReinaspublic public booleanboolean ponReinasponReinas ((TableroTablero t, t, intint Size, Size, intint n) {n) {

if (n==0)if (n==0)return true;return true;

intint x, y; // x, y; // posiciónposición de de estaesta reinareinax= nx= n--1; // 1; // cadacada reinareina en en unauna filafilafor (y= 0; y < Size; y++) {for (y= 0; y < Size; y++) {

t.pon(xt.pon(x, y, , y, Casilla.ReinaCasilla.Reina););if (! if (! estanEnJaque(testanEnJaque(t, Size, x, y) ), Size, x, y) )

if ( if ( ponReinas(tponReinas(t, Size, n, Size, n--1) )1) )return true;return true;

t.pon(xt.pon(x, y, , y, Casilla.VACIACasilla.VACIA););}}return false;return false;

}}

Page 13: Algoritmos

13

4949

pruebapruebapublic static void main (String public static void main (String argsargs[]) {[]) {

intint Size= 8;Size= 8;

TableroTablero t = new t = new Tablero(SizeTablero(Size, Size);, Size);

t.imprimet.imprime();();

if (if (ponReinas(tponReinas(t, Size, Size)) {, Size, Size)) {

System.out.println("ConseguíSystem.out.println("Conseguí ponerponer " + Size + " " + Size + " reinasreinas en el en el tablerotablero");");

} else {} else {

System.out.println("NOSystem.out.println("NO ConseguíConseguí ponerponer " + Size + " " + Size + " reinasreinas en el en el tablerotablero");");

}}

t.imprimet.imprime();();

}} 5050

EjercicioEjercicio

Para el próximo díaPara el próximo díaSe recogerá en claseSe recogerá en clase

Dado un tablero de ajedrez, nos preguntamos Dado un tablero de ajedrez, nos preguntamos si un caballo, desde una posición determinada, si un caballo, desde una posición determinada, podría recorrer todo el tablero sin pisar dos podría recorrer todo el tablero sin pisar dos veces la misma casilla.veces la misma casilla.Escribir un programa que lo compruebeEscribir un programa que lo compruebe

PlusPlus: imprimir el recorrido si existe: imprimir el recorrido si existe