Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ilipe

permutação/combinação/array bidimensional

Recommended Posts

Olá!....

Estou criando um código para permutação em action scriot.

permutação é combinações de uma sequencia de numeros, tipo...

 

tenho os números: 123

O script me retorna as sequencias:

 

123

132

321

231

213

 

 

no pascal seria mais ou menos

 

For x := 1 to 3 do
begin
for y:= 1 to 3 do
begin
for z := 1 to 3 do
begin
write (x, y, z);
end;
end;
end;

transformando o código acima para action script fica assim:

 

for (x=0; x<3; x++) {
	for (y=0; y<3; y++) {
		for (z=0; z<3; z++) {
			scape = x+"-"+y+"-"+z;
			trace(scape);
		}
	}
}

Agora tenho que fazer com que ele me retorne todas as combinações possíveis, em 3 números por

vez de 10 números e sem repetição.

Por exemplo: tenho os números 1,2,3,4,5,6,7,8,9,10.

Ele me retorna: 1-2-3, 1-2-4, 1-2-5, 1-2-6, 1-2-7, 1-2-8, 1-2-9, 1-2-10, 1-3-4, 1-3-5 e assim em diante

até fazer todas as combinações possíveis.

 

Alguém tem algum link, artigo ou código para ajuda de preferência em action script, mas outros ervem tb....

Agradeço desde já!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estive lendo artigos e encontrei um que se chama array bidimensional.

Isso serviria para fazer este código?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria mais ou menos assim:

 

for(i=0; i<10; i++)
  for(j=0; i<10; i++)
	for(k=0;k<10;k++)
	  printf("%d%d%d",i j k)

É a mesma coisa que tu fez. Agora só uma coisa, combinação é diferente de permutação que é diferente de arranjo, isso aki é arranjo, pois você pode ter o número 111, 222 ou 333.

 

Depois se ninguém lhe ajudar e eu finalizar oq estou fazendo eu tento lhe dar uma mão, abração

 

Ta ai, acho q funciona do modo que você quer

 

#include <iostream.h>

int main(int argc, char* argv[])
{
  int i;

  int x[9];
  int y[9];
  int z[9];

  for(i=0;i<10;i++)
  {
	x[i] = i;
	y[i] = i;
	z[i] = i;
  }

  for (i=0;i<10;i++)
	for (int j=0;j<10;j++)
	  for (int k=0;k<10;k++)
		if(i!=j && i!=k && k!=j)
		  cout << x[i] << y[j] << z[k] << endl;


  system("PAUSE");

  return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se voce declarar 10 variáveis inteiras num vetor:

 

vetor[10];

As variáveis serão:

 

vetor[0]

vetor[1]

...

vetor[9]

 

 

Como começa com "0" o último elemento do vetor é (tamanho - 1).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Corrigindo:

 

int main(int argc, char* argv[])
{
  int i;

  int x[10];
  int y[10];
  int z[10];

  for(i=0;i<10;i++)
  {
	x[i] = i;
	y[i] = i;
	z[i] = i;
  }

  for (i=0;i<10;i++)
	for (int j=0;j<10;j++)
	  for (int k=0;k<10;k++)
		if(i!=j && i!=k && k!=j)
		  cout << x[i] << y[j] << z[k] << endl;


  system("PAUSE");

  return 0;
}

Não é a mesma coisa.

Interprete esse teste do for como um "faça enquanto".

 

Vamos lá:

"faça enquanto" i = 9

como i é iniciado com 0 o loop não é executado.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

kra, você não vai acessar a posição x[10] desta maneira

 

Um exemplo visual disso é

 

#include <iostream.h>

int main(int argc, char* argv[])
{
  int i,j;

  int x[10];
  int y[9];

  for(i=0;i<=10;i++)
  {
	x[i] = i;
	cout << "Posição: " << x[i] << endl;
  }

  for (j=0;j<10;j++)
	{
	  cout << "Posição: " << x[j] << endl;
	}

  system("PAUSE");

  return 0;
}

O primeiro vetor imprimi de 0 a 10 (11 posições)

O segundo vetor imprimi de 0 a 9 (10 posições)

 

A posição x[10] não vai ser utilizada no for < 10.

 

Usando o vetor y[9] no segundo for imprime a mesma coisa com uma posição a menos

 

for (j=0;j<10;j++)
	{
	  y[j] = j;
	  cout << "Posição: " << y[j] << endl;
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que quero é para fechamento.

os números não podem se repetir e as combinações também não podem se repetir em ordem diferente.

Esolho 4 úmeros: 1,2,3,4

Tem me dar combinações de 3 em 3 até não ter mais combinações:

 

01-02-03

01-02-04

01-03-02

01-03-04

01-04-02

01-04-03

02-01-03

02-01-04

02-03-01

02-03-04

02-04-01

02-04-03

03-01-02

03-01-04

03-02-01

03-02-04

03-04-01

03-04-02

04-01-02

04-01-03

04-02-01

04-02-03

04-03-01

04-03-02

 

Mas se você reparar bem ele repete combinações mas em ordem diferente...

Pr exemplo 01, 02,03 ele repete mais pra frente como 02, 01, 03

O código que responde as combinações acima está em Action Script e é o seguinte:

 

CODE
conta = 0;

n = 4;

zero = "";

scape = new Array();

dezena = new Array();

dezena[1] = "01";

dezena[2] = "02";

dezena[3] = "03";

dezena[4] = "04";

for (a=1; a<=n; a++) {

for (b=1; b<=n; b++) {

if (b != a) {

for (c=1; c<=n; c++) {

if ((c != a) && (c != B)) {

conta += 1;

scape = dezena[a]+"-"+dezena+"-"+dezena[c];

trace(scape);

}

}

}

}

}

como posso arrumar ele?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce está confundindo as bolas.

Na declaração voce fala quantas posições tem seu vetor.

 

int a[10];
int b[9];

Possuem 10 e 9 posições respectivamente. Portanto nenhumas das afirmações abaixo estão corretas.

 

O primeiro vetor imprimi de 0 a 10 (11 posições)

O segundo vetor imprimi de 0 a 9 (10 posições)

 

Aqui voce acessa a posição 10 do vetor x que não foi declarada.

 

for(i=0;i<=10;i++)
  {
	x[i] = i;
	cout << "Posição: " << x[i] << endl;
  }

e aqui voce acessa a posição 9 de y que também não foi declarada.

 

for (j=0;j<10;j++)
	{
	  y[j] = j;
	  cout << "Posição: " << y[j] << endl;
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso seria resolvido de um jeito mais fácil com Prolog ou Haskell (a parte de você fazer as combinacoes).

Em C++ você teria fazer um cache das combinacoes (conjunto,sem ordem) já usadas e verificar se o negocio ja existe la. Com a STL da pra você usar o container Set.

 

#include <iostream>
#include <set>
#include <cstdlib>
using namespace std;
typedef set<int> COMB;

const int combinacao = 3;

int possiveis(int tamanho){
 int num = 1;
 for(int i=tamanho;i>(tamanho-combinacao);i--)
num*=i;
int den = 1;
for(int i=1;i<=combinacao;i++)
  den*=i;

return num/den;
}

int main(int argc,char *argv[]) {

 COMB termo;
 const int tamanho = sizeof(argv)/sizeof(int);
 set<COMB> lista(argv[0],argv[tamanho]);
 int total = possiveis(tamanho);

 int tmp;
 while(lista.size() < total) {
for(int i=0;i<combinacao;i++){
  do {
	tmp = random()%tamanho;
  } while (termo.find(argv[tmp]) != termo::end());
  termo.insert(argv[tmp]);
}

if(lista.empty() || lista.find(termo)==lista::end()) {
  lista.insert(termo);
  termo = new set<int>();
} else if (lista.find(termo)!=lista::end())
  termo.clear();
}
 }
}

 

import java.util.HashSet;
import java.util.Deque;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.math.*;

public class combinacoes {
public static int fatorial(int elements,int combination) {
	Integer num = 1;
	for(int i=elements;i>(elements-combination);i--)
		num *= i;

	Integer den = 1;
	for(int i=1;i<=combination;i++)
		den*=i;
	return num/den;
}

public static void main(String[] args) {
	final int capacity = 3;
	Random rd = new Random();
	Set<Integer> termos = new HashSet<Integer>(capacity);
	Integer tmp;

	Integer possiveis = fatorial(args.length,capacity);
	Set<Set<Integer>> lista = new HashSet<Set<Integer>>();
	Object[] ar;
	while(lista.size() < possiveis) {   
		for(int i=0;i<capacity;i++) {
			do {
				tmp = rd.nextInt(args.length);
			} while(termos.contains(Integer.parseInt(args[tmp])));			
			termos.add(Integer.parseInt(args[tmp]));
		}

		if(lista.isEmpty() || !lista.contains(termos)) {
			lista.add(termos);
			termos = new HashSet<Integer>(capacity);
		} else if (lista.contains(termos))
			termos.clear();
	}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.