Sortear linhas e colunas de uma matriz[RESOLVIDO]

4 respostas
R

Pessoal, bom dia! Sou iniciante em Java, e tenho um probleminha para resolver: Tenho uma matriz 9x9 pré definida com elementos que não se repetem em nenhuma linha, e em nenhuma coluna. O que preciso fazer, é aleatoriamente trocar uma linha pela outra, ou uma coluna por outra, para mudar os elementos mantendo a “regra”(elementos não repetir em nenhuma linha ou colina) . Estou com dúvidas no que fazer, para “sortear” as linhas e colunas? Teria que criar uma variável pra isso? Segue código até agora, que contém apenas a matriz, um contador, algumas variáveis e uma função.

import java.util.Random;

public class Ajuda{
  public static void main(String[] args){
 
  Random gerador = new Random();     

//Variáveis necessárias para o Algoritmo:   
 
int[][] matriz = {
{8,3,5,4,1,6,9,2,7},
{2,9,6,8,5,7,4,3,1},
{4,1,7,2,9,3,6,5,8},
{5,6,9,1,3,4,7,8,2},
{1,2,3,6,7,8,5,4,9},
{7,4,8,5,2,9,1,6,3},
{6,5,2,7,8,1,3,9,4},
{9,8,1,3,4,5,2,7,6},
{3,7,4,9,6,2,8,1,5}
};

  int cont;
  int mudar;
//Mostrando a Matriz Original, "chamando" a função "mostrarMatriz".   
    System.out.println("Matriz Original:");
     mostrarMatriz(matriz);   
  
  }
 
//Criando uma função para mostrar uma Matriz 
  public static void mostrarMatriz(int m[][]){
    int linha, coluna;
    for(linha = 0; linha < 9; linha++){
      for(coluna = 0; coluna < 9; coluna++){
        System.out.print(m[linha][coluna]);
      } 
       
       System.out.println("  ");

     }

  }


}

4 Respostas

CWeiler

Considerando que a matriz já obedeça a regra, apenas trocando uma linha de lugar, ou uma coluna de lugar, a regra será mantida, não é necessário reordenar (“sortear”) os elementos internos.

Algoritmo de substituição direta simples:
Para trocar uma linha da posição i para a posição j você deve criar um array temporário de 9 posições, copiar a linha j no array temporário, copiar a linha i na linha j, copiar o array temporário na linha i. Para coluna basta mudar todas as ocorrências de linha para coluna neste parágrafo.

Dica, não é necessário copiar cada elemento (1 a 1).

R

CWeiler:
Considerando que a matriz já obedeça a regra, apenas trocando uma linha de lugar, ou uma coluna de lugar, a regra será mantida, não é necessário reordenar (“sortear”) os elementos internos.

Algoritmo de substituição direta simples:
Para trocar uma linha da posição i para a posição j você deve criar um array temporário de 9 posições, copiar a linha j no array temporário, copiar a linha i na linha j, copiar o array temporário na linha i. Para coluna basta mudar todas as ocorrências de linha para coluna neste parágrafo.

Dica, não é necessário copiar cada elemento (1 a 1).

Bom dia! Desculpe pela demora, segui suas dicas e deu certo meu código, muito obrigado! Segue abaixo:

import java.util.Random;  
public class Mat {
  public static void main(String[] args){
  Random gerador = new Random();  
  int sortear1;
  int sortear2;
  int x, y;
  int cont = 0;
  int[] vetor = new int[9];
    int[][] matriz = {
      {1,2,3,4,5,6,7,8,9},
      {2,3,4,5,6,7,8,9,1},
      {3,4,5,6,7,8,9,1,2},
      {4,5,6,7,8,9,1,2,3},
      {5,6,7,8,9,1,2,3,4},
      {6,7,8,9,1,2,3,4,5},
      {7,8,9,1,2,3,4,5,6},
      {8,9,1,2,3,4,5,6,7},
      {9,1,2,3,4,5,6,7,8}, 
  };
  System.out.println("Matriz Oroginal: "); 
      mostrarMatriz(matriz);
  
  System.out.println(" ");
  cont = 0;

  while(cont < 10){
   sortear1 = gerador.nextInt(0+9);
   sortear2 = gerador.nextInt(0+9);
      while(sortear1 == sortear2){
         sortear1 = gerador.nextInt(0+9);
         sortear2 = gerador.nextInt(0+9);
      }
     for(x = 0; x < 9; x++){
      for(y = 0; y <9; y++){
         vetor[x] = matriz[sortear1][y];
         matriz[sortear1][y] = matriz[sortear2][y];
         matriz[sortear2][y] = vetor[x];
      }
    
    }


    cont++;
    }  
   cont = 0;

  while(cont < 10){
   sortear1 = gerador.nextInt(0+9);
   sortear2 = gerador.nextInt(0+9);
   while(sortear1 == sortear2){
         sortear1 = gerador.nextInt(0+9);
         sortear2 = gerador.nextInt(0+9);
   } 
   for(x = 0; x < 9; x++){
      for(y = 0; y <9; y++){
         vetor[x] = matriz[y][sortear1];
         matriz[y][sortear1] = matriz[y][sortear2];
         matriz[y][sortear2] = vetor[x];
      }
    
    }


    cont++;
    }  
  
  
  

  System.out.println("Matriz Alterada: "); 
      mostrarMatriz(matriz);
  
  }  
  
  public static void mostrarMatriz(int matriz[][]){
    int x;
    int y; 
    
    for(x = 0; x < 9; x++){
      for(y = 0; y < 9; y++){
        System.out.print(" "+matriz[x][y]+" ");
      }    
     System.out.println(" ");
    }
    
  }   
  
}
CWeiler

Muito bom renankist. Algumas considerações apenas:


? = gerador.nextInt(0+9)Este método irá retornar um valor aleatório >= 0 e < 9. Ou seja, você não terá a ocorrência do valor 9 nunca. Pelo conteúdo do seu código “0+9” acredito que você quis passar a ideia de “um valor entre 0 e 9”, quando a ideia mais correta seria “um valor no comprimento de 10 a partir de 0”, então seria assim:

? = 0 + gerador.nextInt(10)Mais informações: http://claudioweiler.blogspot.com.br/2014/08/numeros-aleatorios-em-java.html

O mesmo problema nos seus for, onde deve ser “x = 0; x <= 9” ou “x = 0; x < 10”

while(sortear1 == sortear2){ sortear1 = gerador.nextInt(0+9); sortear2 = gerador.nextInt(0+9); }
Não é necessário obter 2 números aleatórios novamente, pode simplificar assim:

while(sortear1 == sortear2){ sortear2 = gerador.nextInt(0+9); }

for(x = 0; x < 9; x++){ for(y = 0; y <9; y++){ vetor[x] = matriz[sortear1][y]; matriz[sortear1][y] = matriz[sortear2][y]; matriz[sortear2][y] = vetor[x]; } } Para a troca de linhas é possível fazer a manipulação direta da 1ª dimensão inteira:vetor = matriz[sortear1]; matriz[sortear1] = matriz[sortear2]; matriz[sortear2] = vetor;
Conceito de manipulação de array ou bloco de memória.

Para coluna (2ª dimensão) não é possível, mas pode ser feito com apenas 1 for:for(x = 0; x <= 9; x++){ vetor[x] = matriz[x][sortear1]; matriz[x][sortear1] = matriz[x][sortear2]; matriz[x][sortear2] = vetor[x]; } E, neste caso, também pode ser utilizado apenas uma variável int no lugar do vetor.

R

CWeiler, muito obrigado por todas as dicas. Com certeza vou utilizar estas daqui pra frente também!

Abraços

Criado 8 de outubro de 2014
Ultima resposta 10 de out. de 2014
Respostas 4
Participantes 2