Skip to content

Instantly share code, notes, and snippets.

@delucas
Created May 11, 2012 03:11
Show Gist options
  • Save delucas/2657297 to your computer and use it in GitHub Desktop.
Save delucas/2657297 to your computer and use it in GitHub Desktop.
UNTreF - LP1 - Resolución ejercicio Casa y Terreno
package ar.edu.untref;
public class CasaYTerreno { // 1 = obstaculo. 0 = libre
private int[][] matrizCasa = { { 0,0,0,0 },
{ 0,0,0,0 },
{ 0,1,1,0 },
{ 1,1,1,1 } };
private boolean casaDentroDeTerreno = false;
private char posicionPuerta = 's';
private int[][] matrizTerreno;
/**
* constructor que recibe matriz terreno
* @param terreno contiene matriz del terreno
*/
public CasaYTerreno ( int [][] terreno){
this.matrizTerreno = terreno;
} //fin constructor
/**revisa si la casa entra en un determinado sector del terreno
*
* @param limiteFila contiene ultima fila de la matriz casa
* @param desfasajeFila contiene desplazamientos de filas hacia el sector donde se intenta colocar la casa
* @param limiteColumna contiene ultima columna de la matriz casa
* @param desfasajeColumna contiene desplazamientos de columnas hacia el sector donde se intenta colocar la casa
* @return true si encaja, false si no
*/
private boolean encaja ( int limiteFila, int desfasajeFila , int limiteColumna , int desfasajeColumna ){
boolean encaja = true ;
for (int i = 0 ; i < limiteFila ; i++){
for (int j = 0 ; j < limiteColumna ; j++){
if (this.matrizCasa [i][j] == this.matrizTerreno [ i + desfasajeFila ][j + desfasajeColumna] && this.matrizCasa [i][j] == 1 ){
encaja = false ;
break;
}
}
if (!encaja){
break;
}
}
return encaja ;
} //fin metodo
/**
* coloca la casa en el terreno
* @param limiteFila contiene ultima fila de la matriz casa
* @param desfasajeFila contiene desplazamientos de filas hacia el sector donde se intenta colocar la casa
* @param limiteColumna contiene ultima columna de la matriz casa
* @param desfasajeColumna contiene desplazamientos de columnas hacia el sector donde se intenta colocar la casa
*/
private void colocarCasaEnTerreno ( int limiteFila, int desfasajeFila , int limiteColumna , int desfasajeColumna ){
for ( int i = 0 ; i < limiteFila ; i ++ ){
for ( int j = 0 ; j < limiteColumna ; j ++ ){
if ( this.matrizTerreno [ i + desfasajeFila][ j + desfasajeColumna] == 0 && this.matrizCasa[i][j]== 1 ){
this.matrizTerreno [ i + desfasajeFila][ j + desfasajeColumna] = 1;
}
}
}
}//fin metodo
/**
* gira la casa
*/
private void girarCasa (){
int [][] matrizAuxiliar = new int [4][4];
for (int i = 0 ; i < this.matrizCasa.length ; i++){
for (int j = 0; j < this.matrizCasa[0].length;j++){
matrizAuxiliar [j][this.matrizCasa.length - 1 - i] = this.matrizCasa [i][j];
}
}
this.matrizCasa = matrizAuxiliar;
} //fin metodo
/**
* revisa si la casa entra en el terreno y si entra la coloca
*/
public int [][] ingresoCasaEnTerreno (){
boolean encaja = false ;
int giros = 0;
int desfasajeFila = 0;
int desfasajeColumna = -1;
while ( giros < 4 && !encaja ){
desfasajeFila = 0;
desfasajeColumna = -1;
while ( !encaja && desfasajeFila <= this.matrizTerreno.length - this.matrizCasa.length ){ //intento meter casa en terreno
if ( desfasajeColumna == this.matrizTerreno[0].length - this.matrizCasa[0].length ){
desfasajeColumna = 0;
desfasajeFila++;
} else {
desfasajeColumna++;
}
encaja = this.encaja(this.matrizCasa.length, desfasajeFila, this.matrizCasa[0].length, desfasajeColumna);
}
giros++;
if (!encaja && giros <=3){ //giro la casa
this.girarCasa();
switch ( giros ){
case 1: this.posicionPuerta = 'o';
break;
case 2:this.posicionPuerta = 'n';
break;
case 3:this.posicionPuerta = 'e';
break;
}
}
}//fin while
if ( encaja ){
this.colocarCasaEnTerreno(this.matrizCasa.length, desfasajeFila, this.matrizCasa[0].length, desfasajeColumna);
this.casaDentroDeTerreno = true;
} else {
throw new Error ("la casa no entra en el terreno");
}
return this.matrizTerreno;
} //fin metodo
//*******************
//METODOS QUE MUESTRAN MATRICES Y ORIENTACION DE LA PUERTA POR CONSOLA (PARA VER RESULTADOS)
//utilizado para primer test para ver fallas mas detalladamente
//lo que se muestra x consola es lo que se pide en el primer test
/**
* muestra matrizterreno por consola y casa
*/
public void mostrar() {
for (int i = 0 ; i < this.matrizTerreno.length; i++){
for (int j = 0 ; j < this.matrizTerreno.length; j++){
System.out.print (" " + this.matrizTerreno [i][j]);
}
System.out.println();
}
for (int i = 0 ; i < this.matrizCasa.length; i++){
for (int j = 0 ; j < this.matrizCasa.length; j++){
System.out.print (" " + this.matrizCasa [i][j]);
}
System.out.println();
}
}//fin metodo
/**
* muestra orientacion de la puerta por consola
* @return posicion puerta
*/
public char getPuerta() {
System.out.println(this.posicionPuerta) ;
return this.posicionPuerta;
}
} //fin clase
package ar.edu.untref;
import org.junit.Assert;
import org.junit.Test;
public class Tests {
@Test
public void queSeMuestre (){
int [][] terreno = { { 1,1,1,1,1,1 },
{ 1,1,1,1,0,1 },
{ 1,1,1,0,0,1 },
{ 1,1,1,0,0,1 },
{ 1,1,1,1,0,1 },
{ 1,1,1,1,1,1 }, };
CasaYTerreno vivienda = new CasaYTerreno (terreno);
vivienda.ingresoCasaEnTerreno();
vivienda.mostrar ();
vivienda.getPuerta();
}
@Test
public void queLaCasaQuedeDondeCorresponde (){
int [][] terrenoEsperado = { { 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 } };
int [][] terreno = { { 1,1,1,1,1,1 },
{ 1,1,1,1,0,1 },
{ 1,1,1,0,0,1 },
{ 1,1,1,0,0,1 },
{ 1,1,1,1,0,1 },
{ 1,1,1,1,1,1 }, };
CasaYTerreno vivienda = new CasaYTerreno (terreno);
Assert.assertArrayEquals(terrenoEsperado , vivienda.ingresoCasaEnTerreno() );
Assert.assertEquals ('e', vivienda.getPuerta());
} //fin metodo
@Test
public void queLaCasaQuedeDondeCorresponde2 (){
int [][] terrenoEsperado = { { 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,0,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 } };
int [][] terreno = { { 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,0,1,1 },
{ 1,1,0,0,1,1 },
{ 1,0,0,0,0,1 },
{ 1,1,1,1,1,1 }, };
CasaYTerreno vivienda = new CasaYTerreno (terreno);
Assert.assertArrayEquals(terrenoEsperado , vivienda.ingresoCasaEnTerreno() );
Assert.assertEquals ('s', vivienda.getPuerta());
}
@Test (expected = Error.class)
public void queSalteErrorSiLaCasaNoEntra (){
int [][] terreno = { { 1,1,1,1,1,1 },
{ 1,1,1,1,1,1 },
{ 1,1,1,0,1,1 },
{ 1,1,1,0,0,1 },
{ 1,1,1,1,0,1 },
{ 1,1,1,1,1,1 }, };
CasaYTerreno vivienda = new CasaYTerreno (terreno);
vivienda.ingresoCasaEnTerreno();
}
} //fin clase
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment