ilipe 0 Denunciar post Postado Julho 31, 2008 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
ilipe 0 Denunciar post Postado Julho 31, 2008 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
IvanR 0 Denunciar post Postado Julho 31, 2008 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
Kandrade 7 Denunciar post Postado Julho 31, 2008 É uma solução aninhar os loops. Desse jeito funciona. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Julho 31, 2008 pq começam do 0? Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Julho 31, 2008 Array em C começa no índice 0. Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Julho 31, 2008 então, 0 até 9 são 10 elementos, teria como ser mais explícito pois naum estou vendo o erro Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Julho 31, 2008 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
IvanR 0 Denunciar post Postado Julho 31, 2008 Entao, o for ta indo até o 9, naum até o 10, é só <, naum <=. è o mesmo que botasse for(i=0;i=9;i++) Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Julho 31, 2008 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
IvanR 0 Denunciar post Postado Julho 31, 2008 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
ilipe 0 Denunciar post Postado Julho 31, 2008 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
Kandrade 7 Denunciar post Postado Julho 31, 2008 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
_Isis_ 202 Denunciar post Postado Julho 31, 2008 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
ilipe 0 Denunciar post Postado Agosto 2, 2008 Hum...entendi...valeu pessoal...agora estou tentando passar isso em Action Script que é oq eu preciso... Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Agosto 2, 2008 Só um detalhe: isso nao deveria ter sido postado no forum de AS? Compartilhar este post Link para o post Compartilhar em outros sites