Solución Ejercicio Java : Matriz con entradas en espiral

Solución Ejercicio Java : Matriz con entradas en espiral


Dados dos enteros m y n, escriba un programa que construya una matriz con m renglones y n columnas cuyas entradas sean los números 1, 2, ..., m*n acomodados en espiral, comenzando con el número 1 en la entrada que está en la esquina superior izquierda, siguiendo hacia la derecha, luego hacia abajo, luego hacia la izquierda, luego hacia arriba, y así sucesivamente.

Entrada:


Dos números enteros m, n, separados por un espacio, cuyos valores están entre 1 y 100 (incluyéndolos).

Salida:


La matriz requerida (para mayor detalle, ver el ejemplo de salida, aunque no se requiere exactamente el mismo espaciado, sólo el orden).

Solución:

1. Clase Espiral



package clasi2004;

public class Espiral {
 private int dir;
 private int x;
 private int y;
 private int matriz[][];
 private int total;
 private int linea;
 private int lineaX;
 private int num;
 
 public  Espiral(int a,int b) {
  x=a;
  y=b;
  total=x*y;
  dir=0;
  linea=1;
  lineaX=0;
  matriz=new int[x][y];
  num=1;
  creaMatriz();
 }
 public void muestraMatriz(){
  for (int i = 0; i < matriz.length; i++) {
   for (int j = 0; j < matriz[0].length; j++) {
    System.out.print(matriz[i][j]+"\t");
   }
   System.out.println("");
  }
 }
 private void creaMatriz()  {
  
  do {
   switch (dir) {
   case 0:
    llenaDer();
    break;
   case 1:
    llenaAba();
    break;
   case 2:
    llenaIzq();
    break;
   case 3:
    llenaArr();
     break;
   default:
    break;
   }
  } while (num<=total);
 }

 /**
  * 
  */
 private void llenaArr() {
  for (int i = x-2; i > lineaX; i--) {
   matriz[i][lineaX]=num;
   num++;
  }
  x=x-1;
  dir=0;
 }
 private void llenaIzq() {
  for (int i = y-lineaX-2; i >= lineaX; i--) {
   matriz[x-1][i]=num;
   num++;
   
  }
  dir=3;
 }

 private void llenaAba() {
  for (int i = linea; i < x; i++) {
   matriz[i][y-linea]=num;
   num++;
  }
  dir=2;
  linea++;
 }

 private void llenaDer() {
  if(x!=1){
  int yy=x-(x/2);
  if(matriz[yy][lineaX]!=0)
   lineaX++;
  }
  for (int i = lineaX; i <y-lineaX ; i++) {
   matriz[lineaX][i]=num;
   num++;
  }
  dir=1;
  
 }
}


2. Aplicacion


package clasi2004;

import java.util.Scanner;

public class AplicEspiral {

 /**
  * @param Author DAvid PAredes
  */ 
 public static void main(String[] args) {
  @SuppressWarnings("resource")
  Scanner leer=new Scanner(System.in);
  String a=leer.nextLine();
  EjecutaEspiral(a);
  
 }

 private static void EjecutaEspiral(String a) {
  int x=0,y=0;
  char[]letras=a.toCharArray();
  String aux="";
  for (int i = 0; i < letras.length; i++) {
   if (letras[i]==' ') {
    x=Integer.parseInt(aux);
    aux="";
   }
   else{
    aux=aux+letras[i];
   }
  }
  y=Integer.parseInt(aux);
  Espiral e=new Espiral(x, y);
  e.muestraMatriz();
 }

}

1 comentario:

  1. ¿Cómo hacer que esta inicie desde el centro de la matriz y no de la esquina?

    ResponderEliminar