⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 solucionskylinedyv.java

📁 Java examples for dinamic programming, divide and conquer, greedy algorithms and backtracking.
💻 JAVA
字号:
package soluciones.practi08;

import problemas.Edificio;
import problemas.ProblemaSkyline;
import soluciones.EstrategiaSolucion;
import esquemas.EsquemaDYV;

/**
 * Clase que soluciona el problema del Skyline usando la estrategia de "Divide y
 * vencer醩". Extiende a <code>EsquemaDyV</code> e implementa
 * <code>EstrategiaSolucion</code>. Tiene dos clase internas,
 * <code>ProblemaSky</code> y <code>SolucionSky</code> que implementan
 * respectivamente las interfaces internas <code>Problema</code> y
 * <code>Solucion</code> de <code>EsquemaDyV</code>.
 * 
 * @version 1.2, 15/11/2005
 * 
 */
public class SolucionSkylineDyV extends EsquemaDYV implements
        EstrategiaSolucion {
    /**
     * El problema que tiene que resolver.
     */
    private ProblemaSkyline pb;

    /**
     * La soluci髇 al problema <code>pb</code>.
     */
    private Skyline solucionFinal;

    /**
     * Construye una soluci髇 a partir del problema que recibe.
     * 
     * @param pb
     *            El problema a resolver
     */
    public SolucionSkylineDyV(ProblemaSkyline pb) {
        this.pb = pb;
    }

    /**
     * Devuelve la soluci髇 final encontrada.
     * 
     * @return La soluci髇 al problema
     */
    public Skyline getSolucion() {
        return solucionFinal;
    }

    /**
     * Verdadero si el problema consta de un 鷑ico edificio. Falso en caso
     * contrario.
     */
    protected boolean esCasoBase(Problema p) {
    	// TODO
    	ProblemaSky ps = (ProblemaSky)p;
    	if (ps.problema.length==1)
    		return true;
    	return false;
    }

    /**
     * Devuelve la soluci髇 que contiene el skyline formado por el 鷑ico
     * edificio que tiene el problema.
     */
    protected Solucion resuelveCasoBase(Problema p) {
        // TODO
    	ProblemaSky ps = (ProblemaSky)p;
    	SolucionSky sol = new SolucionSky(ps.problema[0]);
    	return sol;
    }

    /**
     * Divide el problema en dos subproblemas, cada uno de ellos contentiendo la
     * mitad de los edificios del problema que recibe.
     */
    protected Problema[] divide(Problema p) {
    	/*
    	 * Convertimos el problema en un ProblemaSky; de 閘 extraemos el n鷐ero de 
    	 * edificios que contiene, que guardamos en una variable numPbs. En numPbsIzq 
    	 * guardamos la mitad de ese valor.
    	 */
    	// TODO
    	ProblemaSky ps = (ProblemaSky)p;
    	int numPbs = ps.problema.length;
    	int numPbsIzq = numPbs/2;
        
        /*
		 * Creamos el array de subproblemas que hay que devolver, que llamaremos
		 * pbs, con el n鷐ero de elementos adecuados. Cada uno de los dos
		 * subproblemas se crea, mediante el constructor correspondiente.
		 */
        // TODO
    	ProblemaSky [] pbs = new ProblemaSky[2];
    	pbs[0] = new ProblemaSky(numPbsIzq);
    	pbs[1] = new ProblemaSky(numPbs - numPbsIzq);
    	        
        /*
         * Y se transfiere a cada uno de los dos subproblemas los edificios
         * de los que consta cada uno de ellos; primero a uno...
         */
        // TODO
    	int i=0;
    	while (i < numPbsIzq){
    		pbs[0].problema[i] = ps.problema[i];
    		i++;
    	}
        
        /*
         * ... y luego al otro.
         */
        // TODO
    	int j=0;
    	while (i<numPbs){
    		pbs[1].problema[j] = ps.problema[i];
    		j++;
    		i++;
    	}
        /*
         * Por 鷏timo, se devuelve el arrray de problemas creado.
         */
        return pbs;
    }

    /**
     * Combina los dos skylines que recibe en uno solo, haci閚dolo mediante una
     * mezcla ordenada de los dos skylines. Tiene una casu韘itica complicada.
     * Tiene un coste lineal.
     */
    protected Solucion combina(Solucion[] sk) {
        /*
         * Guardamos el primer skyline en s1 para m醩 comodidad
         */
    	int[] sk1 = ((SolucionSky) sk[0]).sk.getVector();

        /*
         * Y el segundo en s2
         */
        int[] sk2 = ((SolucionSky) sk[1]).sk.getVector();
        
        int n1 = sk1.length;   // El n鷐ero de elementos del primer skyline
        int n2 = sk2.length;   // El n鷐ero de elementos del segundo skyline

        /*
         * Este es el array de destino, que tiene como m醲imo este n鷐ero de
         * elementos
         */
        int[] aux = new int[n1 + n2];     

        int i = 1;          // Con este 韓dice recorremos s1
        int j = 1;          // Con este 韓dice recorremos s2
        int k = 1;          // Con este 韓dice recorremos aux

        /*
         * Por convenio el primer elemento de un skyline siempre es 0 
         * (la altura del suelo previo al skyline)
         */
        aux[0] = 0;     

        /*
         * Esta ser

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -