[RESOLVIDO] Anagrama

Fiz um metodo para fixar uma posição do vetor e depois ir percorrendo o vetor e mostrando as combinações das letras, porem ele nao mostra todas.

Me ajudem a ver o que preciso corrigir.

Ps: Não é exercicio de faculdade nao. Estava brincando em um joguinho na internet e este joguinho era parecido com anagrama. Aí resolvi tentar fazer, mas nao saiu como eu queria.

public class java {
	/**
	 * Este metodo recebe o vetor contendo a palavra e mostra para o usuario
	 * todas as possibilidades de anagrama com esta palavra.
	 * 
	 */
	private static void Calcula_Anagrama(char vetor[]) {
		int i = 0, contador = 0;

		System.out.println("             " + "i" + " - " + "c : ");

		do {
			for (i = 0; i <= vetor.length - 1; i++) {
				// troca
				Troca_Posicao(vetor, i, contador);
				System.out.print("TROCA:       " + i + " - " + contador + " : ");
				Mostra(vetor);
				// destroca
				Troca_Posicao(vetor, i, contador);
				// System.out.print("DESTROCA:    " + i + " - " + contador + " : ");
				// Mostra(vetor);

			}// for
			contador++;
		} while (contador <= (vetor.length - 1));
	}// fim metodo Calcula_Anagrama()

	/**
	 * Este metodo efetua a troca das posições desejadas
	 * 
	 */
	private static void Troca_Posicao(char[] vetor, int i, int contador) {
		char aux;
		aux = vetor[contador];
		vetor[contador] = vetor[i];
		vetor[i] = aux;
	}// fim metodo Troca_Posicao()

	/**
	 * Este metodo mostra a palavra. A palavra é armazenada em um vetor para
	 * ficar mais facil o manuseio
	 * 
	 */
	private static void Mostra(char[] vetor) {
		for (int i = 0; i < vetor.length; i++) {
			System.out.print(vetor[i] + " ");
		}// for
		System.out.println("");
	}// fim metodo Mostra()

	public static void main(String args[]) {
		// 'C','A','S','A'
		// 'A', 'B', 'R', 'I', 'L'
		// 'T','E',' ','A','M','O'
		// 'C','A','S','E'
		// 'A','M','A','R','E','L','O'
		// 'P','R','E','F','E','I','T','U','R','A'
		char vetor[] = { 'C','A','S','E' };
		Calcula_Anagrama(vetor);

	}
}

Não estás a fazer todos os anagramas, mas só aqueles em que são trocadas apenas duas letras.

Concordo que so troco o que tem duas letras, porem eu fixo em um lugar e percorro todo o vetor.
Fixo em outro e percorro novamente.
E assim por diante.

Fazendo isso ele teria que me mostrar tudo, porem nao mostra

Errado.

Fixas numa posição e percorres todo o vector a trocar e destrocar (daí só aparecerem os anagramas que envolvem apenas troca de duas letras)

Assim de repente, penso que será necessário recursividade para resolver o problema. Isto é algo parecido com as permutações matemáticas. O número total de anagramas será n!, onde n é o número de letras.

entendi.
Vou dar uma olhada aqui e posto depois o que consegui

Valeu a ajuda. Funcionou perfeitamente.
Tive que mudar minha ideia do codigo original, mas a permutação funcionou belezinha.

O codigo final esta aí para vcs verem.

import javax.swing.JOptionPane;

public class Anagrama {

	public static void main(String[] args) {

		String palavra = Digite_a_palavra();
		char vetor[];

		/**
		 * metodo que retira todos os espaços do inicio, meio e fim das palavras
		 * digitadas
		 */
		palavra = Retira_Espaco(palavra);

		vetor = new char[palavra.length()];

		/**
		 * metodo que armazena a palavra em vetor
		 */
		Quebra_Palavra(palavra, vetor);

		/**
		 * metodo que cria o anagrama
		 */
		Calcula_Anagrama(vetor, 0);

		/**
		 * finaliza programa
		 */
		System.exit(0);
	}// fim main()

	/**
	 * Este metodo pede ao usuario para entrar com uma palavra
	 * 
	 * @return palavra
	 */
	private static String Digite_a_palavra() {
		String palavra = "";
		while (palavra.length() <= 2) {
			palavra = JOptionPane.showInputDialog(null,
					"Digite uma palavra de no minimo 3 caracteres",
					"Calculando Anagrama", JOptionPane.INFORMATION_MESSAGE);
		}
		return palavra;
	}// fim metodo Digite_a_palavra()

	/**
	 * Este metodo mostra a palavra. A palavra é armazenada em um vetor para
	 * ficar mais facil o manuseio
	 * 
	 * @param vetor
	 */
	private static void Mostra(char[] vetor) {
		for (int i = 0; i < vetor.length; i++) {
			System.out.print(vetor[i] + " ");
		}// for
		System.out.println("");
	}// fim metodo Mostra()

	/**
	 * Este metodo recebe uma palavra e remove todos os espaços entre, durante e
	 * no final de qualquer palavra.
	 * 
	 * @param palavra
	 * @return palavra_sem_espaços
	 */
	private static String Retira_Espaco(String palavra) {
		String alterada = "", interna = (palavra).trim();
		char c;

		for (int i = 0; i < interna.length(); i++) {
			c = interna.charAt(i);
			if (Character.isLetterOrDigit(c)) {
				alterada += c;
			}// if
		}// for

		return alterada;
	}// fim metodo Retira_Espaco()

	/**
	 * Este metodo recebe o vetor contendo a palavra e mostra para o usuario
	 * todas as possibilidades de anagrama com esta palavra.
	 * 
	 * @param vetor
	 */
	private static void Calcula_Anagrama(char vetor[], int k) {
		int i;
		if (k == vetor.length - 1)
			Mostra(vetor);
		else {
			Calcula_Anagrama(vetor, k + 1);
			i = k + 1;
			while (i < vetor.length) {
				Troca_Posicao(vetor, k, i);
				Calcula_Anagrama(vetor, k + 1);
				Troca_Posicao(vetor, k, i);
				i = i + 1;
			}
		}
	}// fim metodo Calcula_Anagrama()

	/**
	 * Este metodo efetua a troca das posições desejadas
	 * 
	 * @param vetor
	 * @param i
	 * @param k
	 */
	private static void Troca_Posicao(char[] vetor, int k, int i) {
		char aux;
		aux = vetor[i];
		vetor[i] = vetor[k];
		vetor[k] = aux;
	}// fim metodo Troca_Posicao()

	/**
	 * Este metodo recebe a palavra e um vetor vazio e retorna o vetor contendo
	 * a palavra
	 * 
	 * @param palavra
	 * @param vetor
	 */
	private static void Quebra_Palavra(String palavra, char vetor[]) {
		for (int i = 0; i < vetor.length; i++) {
			vetor[i] = palavra.charAt(i);
		}// for
	}// fim metodo Quebra_Palavra()
}// fim class

Flw…