1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Dúvida de como embaralhar vetores já embaralhados entre si.

Oi pessoal, eu tô tentando desenvolver um código que gera embaralhamentos para cubo mágico. Eu achei um método que embaralha elementos de um vetor comum e implementei, depois criei um vetor diferente para armazenar cada tipo de movimento do cubo, ficou assim:

    public static void embaralhar(String[] vetor) {

        Random embaralhamento = new Random();

        for (int i = 0; i < (vetor.length - 1); i++) {

            //sorteia um índice \/
            int sorteio = embaralhamento.nextInt(vetor.length);

            //troca o conteúdo dos itens i e j do vetor 
            String temp = vetor[i];
            vetor[i] = vetor[sorteio];
            vetor[sorteio] = temp;

        }

    }


            String[] movimentosTipo1 = {"F", "R", "U", "L", "D", "B"};

            embaralhar(movimentosTipo1);

            System.out.println("Seu scramble de cubo 3x3x3 é:");

            for (String scramble1 : movimentosTipo1) {

                System.out.print(scramble1 + " ");

            }

            String[] movimentosTipo2 = {"F'", "R'", "U'", "L'", "D'", "B'"};

            embaralhar(movimentosTipo2);

            for (String scramble2 : movimentosTipo2) {

                System.out.print(scramble2 + " ");

            }

            String[] movimentosTipo3 = {"F2", "R2", "U2", "L2", "D2", "B2"};

            embaralhar(movimentosTipo3);

            for (String scramble3 : movimentosTipo3) {

                System.out.print(scramble3 + " ");

            }

Um exemplo de saída pode ser:

B R L U D F D' L' U' R' B' F' U2 D2 B2 F2 L2 R2

ou

F B D U L R R' F' U' D' L' B' B2 D2 U2 L2 R2 F2

Em ambos os casos o embaralhamento é funcional, mas os tipos de movimentos aparecem isolados e em sequência, assim:

B R L U D F | D' L' U' R' B' F' | U2 D2 B2 F2 L2 R2

Isso não faz do embaralhamento muito eficiente...Logo eu pensei que se tivesse alguma maneira de misturar o embaralhamento final de cada vetor com os embaralhamentos finais dos outros vetores eu poderia chegar num resultado como este:

L2 F2 L2 U F2 U B2 U R2 D2 B2 L B D' L' B2 F D'

Ah! Eu também tentei fazer apenas um vetor que continha todos os movimentos juntos, o problema foi que eu recebia embaralhamentos como este:

F F' F2 U R' R D2 L' L2 D' B2 D B L U2 R2 U' B'

Nesse caso está totalmente incoerente, já que a letra F, em cubo mágico, representa um movimento de uma determinada face. No começo ali já dá pra ver a mesma face sendo girada três vezes seguidas! (independente do sentido que está sendo girada), além de um R' e R, L' e L2 seguidos...

Enfim, espero que tenham compreendido meu problema, será se com meus conhecimentos básicos de java tem como fazer isso? hahahah

Obrigado pela atenção ^^


EDIT: Tenho usado o método do romero.dias mas como eu coloquei no comentário esse método me retorna embaralhamentos inviáveis. Como ele não entendeu bem a regra e outros também possam não ter entendido vou tentar explicar melhor.

O cubo tem 3 tipos de movimentos para cada face. Logo, se tem 6 faces no cubo serão 18 tipos de movimentos no cubo todo (tô desprezando os movimentos de meio M, S e E). Certo, nessa lógica o método do romero gera um embaralhamento legal, mas o que acontece é que além dos tipo de movimentos a posição de cada movimento também influencia, que no método dele isso não acontece. Por exemplo, o movimento F (face frontal do cubo, "front") é oposto ao movimento B (face de trás do cubo "behind"), portanto se eu receber um scramble que tenha uma sequência de F F' F2, ou F B F' B2, ou até mesmo F B F' B2 B' F2 as peças dessas faces não iriam sair do lugar, não iriam trocar entre si. Então, nesse caso, tem-se que:

-F e B são opostos;
-U e D são opostos;
-L e R são opostos;

Eu imaginei que pra resolver isso pudesse escrever, além dos arrays para os 3 tipos de movimentos para cada face, arrays para a relação dos movimentos opostos. Daí algum método embaralharia os movimentos como os que o método do romero faz mas além disso embaralharia sem repetir um array de movimento oposto ao movimento que acabou de ser gerado...eu tentei fazer isso mas não consegui kkkk

Ah, e pra finalizar esse projeto, nesse caso temos 18 elementos que são gerados no total mas para que o embaralhamento seja completamente perfeito a quantidade de elementos para serem mostrados deveria ser entre 20 e 22! Nesse caso obviamente deveríamos fazer com que alguns movimentos fossem repetidos, mas claro, respeitando a condição dos movimentos opostos...

Bem, isso tá complicado pra mim pois sou bem iniciante na programação por isso tô pedindo ajuda hahahah, no aguardo!, ^^

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java random ou faça a sua própria pergunta.