Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Kenkox

#1
Ejercicios / Algoritmo con Barridos (sweep)
2 Abril 2013, 07:11 AM
Hay un Problema que he pensado bastante pero no se me ha ocurrido una solucion viable. Este problema creo que si los hara pensar un rato

Es este Problema

http://www.cmirg.com:8081/traingate/visualiza.php?usuario=0043a7894053f75f&task=cuentas

En un principio te dan numeros separados por espacios, los 1 significan cuentas de otros colores y los 0 cuentas negras. Tambien como dato te dan el numero de cuentas negras que vas a sacar de ese hilo. Lo que se tiene que hacer es encontrar el menor numero de cuentas que tienes que sacar para poder tener el numero de cuentas negras dadas por el usuario.

001001010101

Digamos que el usuario quiere sacar 4 cuentas negras... el numero minimo que debe de sacar es 1... ya que puedo tomar directamente las 2 del primer extremo, saco una cuenta de color y encuentro otras 2 cuentas negras libres.....

Todo viene mejor explicado en el link anterior.

Mi idea de resolucion es primero tomar las cuentas de los extremos( siempre y cuando haya ).. despues, empezar a contar de un primer extremo hasta tener las cuentas negras deseadas... y obviamente llevar la cuenta de las cuentas de colores.... y hacer lo mismo con el otro extremo......y despues comparar quien tenga menos cuentas de colores... el problema es que no creo que esta solucion resuelva todos los casos posibles para ese problema.... ya que segun yo pueden existir una infinidad de casos en los que mi programa siguiendo mi "algoritmo", de una solucion erronea...

Asi que les queria pedir ayuda para ver si son tan amables de dar "ideas" para la resolucion del problema. Por cierto, el programa se hace en c++,c o pascal, pero no me quiero meter ahorita con el lenguaje, solo quiero terminar el algoritmo mas viable...

Otra solucion que se me ocurrio fue ir contando los 0's hasta encontrar un 1, apartir de ahi, ver cuantos 1's existen y despues contar cuantos ceros existen en ese lugar.... hacer lo mismo en el otro extremo y apartir de saber cuantos 1's existen y e numero de 0's , tomar la decision de hacia que extremo continuar. PEro igual veo varias deficiencias.

De antemano muchas gracias
#2
Aqui hay 4 clases, una clase se llama StudentsRegister, la cual implementa a la interfaz Serializable, tiene 3 variables de instancia con sus respectivos metodos get y set.... esa clase la he revisado, y esta perfectamente echa.
La siguiente clase se llama DesSer, la cual ayuda a serializar y deserializar en el archivo... tiene un metodo que se llama setList.. la cual llama al metodo writeObject(); para escribir la lista que se recibe  en el archivo.. ademas tiene un metodo llamado getList, la cual regresa un ArrayList<StudentsRegister> ( este metodo desserializa el archivo, y utiliza al metodo readObject
..
despues esta la clase ABC.. esta clase esta incompleta, no puedo completarla ya que tengo un problema con las altas ( agregar alumnos a un arrayList y escribirlo en un archivo )
La clase ABC tiene al metodo addStudents... primero pido cuantos alumnos se van a agregar, y despues , estos datos se utilizan para inicializar cada miembro del  array register, al momento de inicializarlos los agrega al arrayList..... al momento de que se introdujeron todos los datos de los estudiantes, se llama al metodo setList de la clase DesSer para escribir esta lista en el archivo.... este proceso esta bien.. o por lo menos no he notado ningun error... incluso en el metodo setList puse un println para poner si se han guardado los datos... y si aparece...

despues esta la clase TestABC... el cual contiene el metodo principal.. creamos un objeto ABC... y llamamos al metodo addStudents y al metodo showStudents.... TOODO sucede correctamente, me pide el numero de los alumnos, yo introdusco los datos de los alumnos, y los escribe en el archivo... sin embargo, el problema radica al volver a ejecutar TestABC, por segunda vez introdusco  alumnos nuevos ..  dice que los escribio, despues me muestra los alumnos pero SOLO me muestra a los alumnos que acababa de agregar y NO los que ya habia agregado en la primera ejecucion.. trate de solucionarlo modificando al metodo getList.. pero sigue sobreescribiendolos...

Alguien podria decirme porque sucede esto? y como podria solucionarlo?? osea, que al momento de que llame al metodo showStudents, me muestre a todos los alumnos( objetos ) que ya he agregada anteriormente

De antemano, Gracias

Código (java) [Seleccionar]
package abc;

import java.io.IOException;

/**
*
* @author Kenkox
*/
public class TestABC {
   public static void main( String args[] ) throws IOException{
      ABC proyect = new ABC();
      proyect.addStudents();
      proyect.showStudents();

   }
}

Código (java) [Seleccionar]
package abc;
/**
*
* @author Kenkox
*/
import java.io.IOException;
import java.util.*;
public class ABC {

    /**
     * @param args the command line arguments
     */

private static List<StudentsRegister> studentList = new ArrayList<>();
private static StudentsRegister register[];
    private DesSer working = new DesSer();
private Scanner keyboard = new Scanner( System.in );
private String firstName;
private String surname;
private double mark;
private int option;

public void addStudents(){
System.out.println("Insert the number of Students to add ");
final int TOTAL_STUDENTS = keyboard.nextInt();
register = new StudentsRegister[TOTAL_STUDENTS];
for( int i=0; i < register.length; i++ ){
System.out.printf("%s\n%s", "write the name, surname and the mark of the student.", ":? " );
firstName = keyboard.next();
surname = keyboard.next();
mark = keyboard.nextDouble();
register[i] = new StudentsRegister(firstName, surname, mark );
                studentList.add(register[i]);
}
            working.setList( studentList );
}
   
public void consultar(){

}

public void eliminarAlumnos(){

}

public void modificarAlumnos(){

}
public void showStudents() throws IOException{
updateList();
System.out.printf("%-10s%-15s%-15s%11s\n ","Num. List", "Name", "Surname", "Mark");
for( int i= 0; i < studentList.size(); i++ )
System.out.printf("%-10d%s\n",i + 1, studentList.get(i));
}
public void updateList() throws IOException{
studentList = ( ArrayList<StudentsRegister> ) working.getList();
}

}

Código (java) [Seleccionar]
package abc;
/**
*
* @author Kenkox
*/
import java.io.Serializable;
public class StudentsRegister implements Serializable{
    private String name;
private String surname;
private double mark;
public StudentsRegister(){
this( "", "", 0.0 );
}
public StudentsRegister( String name, String sur, double mk ){
setName( name );
setSurname( sur );
setMark( mk );
}
public void setName( String nm){
name = nm;
}
public String getName(){
return name;
}
public void setSurname( String sur){
surname = sur;
}
public String getSurname(){
return surname;
}
public void setMark( double mk ){
mark  = mk;
}
public double getMark(){
return mark;
}

public String toString(){
return String.format("%-15s%-15s%11.2f\n ", getName(),
getSurname(), getMark());
}
}

Código (java) [Seleccionar]
package abc;


/**
*
* @author Kenkox
*/
import java.io.*;
import java.util.*;
public class DesSer {
   
private ObjectOutputStream output;
private ObjectInputStream input;
private String fileName = "StudentsRegister.ser";
    private List<StudentsRegister> temporalList = new ArrayList<>();
    private List<StudentsRegister> temporalList2 = new ArrayList<>();


public void openFileSerialize(){
try{
output = new ObjectOutputStream( new FileOutputStream( fileName ));

}

catch( Exception e ){
System.out.printf("there was an error opening the File: \" %s \" \n ", fileName );
}
}

public void openFileDeserialize(){
try{
input = new ObjectInputStream( new FileInputStream( fileName ) );
}
catch( Exception e ){
System.out.printf("there was en error using the File: \" %s \" \n ", fileName );
}
}

public void setList( Collection<StudentsRegister> registerList ){
try{
openFileSerialize();
output.writeObject( registerList );
            System.out.println("Datos Guardados");
}

catch( Exception e){
System.err.println("Can't write or close the File");
System.exit( 1 );
}
}

public Collection<StudentsRegister> getList() throws IOException{
try{
openFileDeserialize();
            while(true){
              temporalList = ( ArrayList<StudentsRegister> ) input.readObject();
              temporalList2.addAll(temporalList);
            }
}
        catch(EOFException endOfFileException){
         input.close();
         return temporalList2;
        }
catch( IOException | ClassNotFoundException e ){
System.out.println("there was an error reading the file");
System.exit( 1 );
}
      return null;

}
}
#3

Imagine una tortuga mecanica que camina por todo el cuarto, bajo el control de una aplicacion en java. La tortuga sostiene una pluma en una de dos posiciones, arriba o abajo. Mientras la pluma esta abajo, la tortuga va trazando figuras a medida que se va moviendo, y mientras la pluma esta arriba, la tortuga se mueve alrededor libremente, sin trazar nada. En este problema, usted simulara la operacion de la tortuga, y creara un bloc de dibujo computarizado. Utilize un arreglo de 20 x 20 llamado piso, que se inicialice en ceros. Lea los comandos de un arreglo que la contenga. Lleve el registro de la posicion actual de la tortuga en todo momento, y si la pluma se encuentra arriba o abajo. Suponga que la tortuga siempre empieza en posicion (0,0) del piso, con su pluma hacia arriba. A medida que la tortuga se vaya desplazando con la pluma hacia abajo, asigne 1 a los elementos apropiados del arreglo piso. Cuando se de el comando 6, siempre que haya un 1 en el arreglo muestee un asterisco o cualquier caracter. Siempre que haya un cero, mueste un caracter en blanco. " comandos: 1: pluma arriba, 2:pluma abajo 3: voltear a la derecha, 4:voltear a la izquierda, 5,X avanzar hacia delante un numero X de espacios.. 6: imrpimir arreglo.. 9: fin de los datos, centinela.

Este problema, lo vi en un libro, es de Deitel&Deitel, y pues comenze a hacerlo hace unos pocos dias.. el problema fue que al momento de ir avanzando al programa, cada vez mas me perdia XDDDD la verdad es que no se como hacer que la tortuga tome una direccion u otra, asi que cree dos enumeraciones, una para la pluma, y otra para la direccion... este codigo todo lo hize yo, no he depurado ni nada, asi que si le falta algun ";" o hay algun error de escritura, disculpen... el codigo que presento, esta incompleto, en gedit lo tenia mas largo, habia puesto if anidados.. pero despues supe que era mucho lio, y que necesitaba preguntar.

No pido que me escriban el programa, lo que busco es que me den una ayuda, para que encuentre la manera para realizar la aplicacion, no sé podrian guiarme o algo asi. Cabe resaltar que apenas comenze hace 2 meses y medio en java. Lo que no se realizar, es apartir del case 5 xDDD no se como hacer que avanze conforme indique el usuario, no se como hacer para que segun cambien de direccion >.< tenia pensado varios if aninados, lo hize, pero la verdad no me salio mucho que digamos


Muchas gracias de Antemano


Código (java) [Seleccionar]
import java.util.Scanner;

public class Tortuga
{
Scanner entrada = new Scanner( System.in );
private int piso[][] = new int[20][20];
private int centinela = 0;
private int avanze = 0;
private int filaActiva = 0;
private int columnaActiva = 0;
private enum Estado = { LEFT, RIGHT };
private enum Pluma = { UP, DOWN };
Estado direccion;
Pluma estado;
public static void main( String args[] )
{
                for(int contador = 0;contador < piso.lenght; contador++) //inicializamos todo el arreglo
{
for(int contador2 = 0; contador2 < piso[].lenght; contador2++)
piso[contador][contador2] = 0;

} // termina for
System.out.println("Ponga mucha atencion!, estos seran los comandos: \n 1: Pluma arriba\n2: Pluma abajo\n3: Voltear a la derecha\n4: voltear a la izquierda\n5, \"X\": Avanzar hacia delante\n6: Imprimir tablero\n9: Fin del juego");
imprimir();
System.out.println("La tortuga iniciara en el espacio [0][0]...Por favor inserte el comando");
centinela = entrada.nextInt;
                 //inicia while
while( centinela > 9 || centinela <= 0 || centinela == 7 || centinela == 8)
{
System.out.println("Por favor inserte un numero valido");
centinela = entrada.nextInt;
}
while( centinela != 9 )
{
switch( centinela )
{
case 1: estado = Pluma.UP;
break;
case 2: estado = Pluma.DOWN;
break;
case 3: direccion = Estado.RIGHT;
break;
case 4: direccion = Estado.LEFT;
break;
case 5: System.out.println("Por favor, inserte el numero de espacios para avanzar");
avanze = entrada.nextInt();
if( estado == Pluma.UP )
{
            }
break;
case 6: imprimir(arreglo[]);
break;
}

System.out.println("Por favor inserte otro comando");
centinela = entrada.nextInt;
} // termina while


} // termina main

private static void imprimir()
{ //inicia imprimir
System.out.println("\nAhora mismo te mostraremos el tablero:");
for(int fila = 0; fila < piso.lenght; fila++)
{
for(int columna = 0; columna < piso[fila].lenght; columna++)
System.out.printf("%d ", piso[fila][columna] );
System.out.println("");
}

} // termina imprimir

private static void imprimir(int arreglo[][])
{ //inicia
System.out.println("\nAhora mismo te mostraremos el tablero:");
for(int fila = 0; fila < piso.lenght; fila++)
{
for(int columna = 0; columna < piso[fila].lenght; columna++)
System.out.printf("%d ", piso[fila][columna] );
System.out.println("");
}
} //termina
}