Sortear linhas e colunas de uma matriz[RESOLVIDO]

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("  ");

     }

  }


}  

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).

[quote=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).[/quote]

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(" ");
    }
    
  }   
  
}  

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.

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

Abraços