Título: Matriz 3x3 imprimirla en espiral
Publicado por: lluvplay en 5 Junio 2012, 04:33 am
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 3x3123 456 789 Forma de espiral1 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
Título: Re: Matriz 3x3 imprimirla en espiral
Publicado por: Valkyr en 5 Junio 2012, 15:29 pm
Yo lo haría de esta forma: 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]; 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 ] + ","); } } for(int i = 0; i < b - 1; i++) espacios += " "; String espaciosInicial = espacios ; for(int i = 1;i<tamano + 1; i++){ 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]; } } } } }
No se si será la solución más óptima o no. Recorres una única vez la matriz (después de leerla, claro). Saludos.
Título: Re: Matriz 3x3 imprimirla en espiral
Publicado por: lluvplay en 5 Junio 2012, 15:47 pm
;-) 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 ;-)
Título: Re: Matriz 3x3 imprimirla en espiral
Publicado por: lluvplay en 5 Junio 2012, 17:21 pm
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
Título: Re: Matriz 3x3 imprimirla en espiral
Publicado por: Valkyr en 5 Junio 2012, 22:45 pm
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.
|