Matriz 3x3 imprimirla en espiral

Iniciado por lluvplay, 5 Junio 2012, 04:33 AM

0 Miembros y 1 Visitante están viendo este tema.

lluvplay

Buenas noches programadores, hace unos minutos una conocida me preguntaba lluvplay ! como ago para imprimir una matriz de 3X3 en forma de espiral, yo pense que iva hacer muy facil para mi pero al pasar de los minutos dije uffff lo que me costo, bueno el problema es el siguiente: yo logre al final imprimir la matriz en forma de espiral pero creo que mi codigo no es el mas optimo. El asunto esque quiero ver si alguien tiene un codigo mas obtimo que el mio para revisarlo y ojearlo !!! Obiamente mis poderes no son los mismo que cuando en verdad me exigian en la universidad

Ejemplo del problema: cargar una matriz 3x3 con random he imprimir en forma de espiral ejemplo:
matriz 3x3
123
456
789
Forma de espiral
1
12
123
    6
  56
456
7
78
789

Mi codigo fuente fue para imprimirlo en JTextArea asique solo pondre el codigo que concatena la variable String y luego la envia mediante el SetText(string); al JTextArea. espero sea un debate interezante !!



int matriz[][]=new int[3][3];/// declaracion de la matriz
      int a,b; ///2 variables para el manejo de la matriz dentro del for
      String concatenar="\n-------Matriz 3x3-------\n";/// para imprimir en el JTextArea
      Random rand = new Random();/// declaracion del objeto de la clase Random
      ///llenamos la matriz con los numeros randon
      for(a=0;a<3;a++)
      {
             for(b=0;b<3;b++)
             {
             matriz[a][b]=rand.nextInt(9);// cargamos la matriz
             concatenar=concatenar+matriz[a][b]+",";// concatenamos la matriz para la impresion
             }//fin del for de la variable b
            concatenar=concatenar+"\n";/// concatenamos un salto de linea
      }//Fin del for de la variable a
      concatenar=concatenar+"\n---------------------\n";
      int x=0;
      a=0;
       while(a<3) //// solo para 3 x3 XD
           {
            for(b=0;b<=x;b++)
             {
             concatenar=concatenar+matriz[a][b]+" ";// concatenamos la matriz
             }//fin del for de la variable b
            concatenar=concatenar+"\n";/// concatenamos un salto de linea
               if(x==2)
                {
                a=a+1;
                if(a>2)
                    break;
                while(x>=0)
                        {
                                         if (x==2)
                                         concatenar=concatenar+"      ";//solo para ordenar
                                         if(x==1)
                                         concatenar=concatenar+"   ";   //solo para ordenar         
                                         for(b=x;b<=2;b++)
                                        {
                                         concatenar=concatenar+matriz[a][b];// concatenamos la matriz
                                          }//fin del for de la variable b
                                         x=x-1;
                                    concatenar=concatenar+"\n";/// concatenamos un salto de linea
                }///fin del while
             a=a+1;
             String cadenaNueva = concatenar.substring(0, concatenar.length()-1);/// como agaraba 2 salto de linea segido elimine uno para que kedara justo
               concatenar=cadenaNueva;
                }else
                {
                 x=x+1;
                }
      }//Fin del for de la variable a
      jTextArea1.setText(concatenar);


Todo ese codigo esta dentro de una accion del boton llnar la matriz
:huh: :huh: :huh: :huh: :huh: :huh: :huh: :huh: :P :P :P :P
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

Valkyr

#1
Yo lo haría de esta forma:

Código (java) [Seleccionar]

import java.util.Random;

public class Prueba{

public static void main(String[] args){
int tamano = 5;
int b = 5;
int matriz[][] = new int[tamano][b];
      Random rand = new Random();
      String espacios = "";
for(int i=0;i<tamano;i++){
for(int j=0;j<b;j++){
matriz[i][j] = rand.nextInt(9);
System.out.print(matriz[i][j] + ",");
}
System.out.println();
}

for(int i = 0; i < b - 1; i++)
espacios += " ";

String espaciosInicial = espacios;
for(int i = 1;i<tamano + 1; i++){
String numeros = "";
if(i % 2 == 0){

for(int j = b - 1; j >= 0; j--){
numeros = matriz[i-1][j] + numeros;
System.out.println(espacios + numeros);
if(espacios.length() >= 1)
espacios = espacios.substring(1);
else
espacios = espaciosInicial;
}
}

else{
for(int j = 0;j < b; j++){
numeros += matriz[i-1][j];
System.out.println(numeros);
}
}

}
}
}


No se si será la solución más óptima o no. Recorres una única vez la matriz (después de leerla, claro).

Saludos.

lluvplay

 ;-) Creo q si es mas obtimo que el mio !!! pero imaginate que pasaria si en v es de ser 3X3 seria 3X5

matriz 3x5
123
456
789
123
456

espiral
123
    6
  56
456
7
78
789
    3
  23
123
4
45
456

de aki fue de donde salio mi duda !!! por eso pense !! mi codigo es obtimo ? y si x algo el sistema tiene que variar !!!

Bueno esas solo son preguntas logicas XD

Pero se ve bueno  ;-)

* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

lluvplay

Hola amigo mirando, aprendiendo, comprendiendo los codigo y sobre todo practicando !!! he llegado al punto que queria tocar !!! es q no importara si la matriz fuera
3X3 o 3X7 o 3X4o 3X(nnumeros) se tendria que imprimir el espiral !! Pues listo!!! aki lo tengo solo tenes q cambiar el valor de colunna y la fila XD
Cuando digo el valor de la colunna y la fila quiero decir q puede ser 4X2 3X4 5X6 no importa como sea tu matriz deve imprimir en espiral !!!

Anexo el codigo: un respeto y muchos saludos al amigo  ;-) valkyr  ;-) por la idea de su codigo !!!

package espiral;

import java.util.Random;

public class Espiral {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
          lluvplay ob=new lluvplay();
        ob.cargar();
        System.out.println("-----------------");
        ob.ordenar();
   
    }
}
class lluvplay
{
    int fila=4;
    String impresion="";
    int colunna=7;
    int matriz[][]= new int [colunna][fila];
    public void cargar()
    {
    Random rand= new Random();
        for (int a=0; a<colunna;a++){
        for(int b=0;b<fila;b++)
        {
        matriz[a][b]=rand.nextInt(9);
        System.out.print(matriz[a][b]);
        }
        System.out.println();
    }
    }
    public void ordenar()
    {
        String concatenar="";
        String connumeros=""; // para concatenar los numeros estetica he impresion
        int tipo_de_entero=0,mantener=0; /// esto es para ver si es par o impar
        while (tipo_de_entero<colunna)
        {
            if(tipo_de_entero%2==0)
            {
                while(mantener<fila)
                {
                    for(int a=0;a<=mantener;a++)
                    {
                 //   System.out.print(matriz[tipo_de_entero][a]);   
                    impresion=impresion+matriz[tipo_de_entero][a];
                    }
                   // System.out.println();
                    impresion+="\n";
                    mantener+=1;
                }
                tipo_de_entero+=1;
                mantener=0;
            }//fin del if(tipo_de_entero%2==0)
            else
            {
                mantener=fila-1;
                while (mantener>=0)
                {
                    for(int b=0;b<mantener;b++)
                        concatenar=concatenar+" ";
                    for(int a=mantener;a<fila;a++)
                    {
                        connumeros=connumeros+matriz[tipo_de_entero][a];
                       // System.out.println();
                    }
                    impresion+=concatenar+connumeros+"\n";
                  //  System.out.println(concatenar+connumeros);
                    concatenar="";
                    connumeros="";
                    mantener-=1;
                }
            tipo_de_entero+=1;
             //String cadenaNueva = concatenar.substring(0, concatenar.length()-1);
             impresion=impresion.substring(0,impresion.length()-1);
            } //fin del else (tipo_de_entero%2==0)
           
        }//fin del mietras
       System.out.print(impresion);
    }   //fin del metodo ordenar
}// fin de la clase lluvplay


Saludos ojala este material sea constructivo para futuras dudas :D
muy importante si alguien tiene otra idea por favor postearla que a mi me sirve mucho comparar ideas y resilver problemas XD
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

Valkyr

En el código que pusé anteriormente simplemente habría que modificar para que la variable "espacios" se rellene con el valor de b. He dejado la modificación por si quieres verla (es prácticamente igual que como estaba antes). Ahora imprime en espiral sea cual sea el valor de tamano y b.

Saludos.