Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;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á!!!!
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;
}É uma solução aninhar os loops.
Desse jeito funciona.
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
pq começam do 0?
Array em C começa no índice 0.
então, 0 até 9 são 10 elementos, teria como ser mais explícito pois naum estou vendo o erro
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).
Entao, o for ta indo até o 9, naum até o 10, é só <, naum <=.
è o mesmo que botasse
for(i=0;i=9;i++)
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;
}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
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 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;
}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?!
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;
}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>(); 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();
}
}
}Hum...entendi...valeu pessoal...agora estou tentando passar isso em Action Script que é oq eu preciso...
Só um detalhe: isso nao deveria ter sido postado no forum de AS?
Estive lendo artigos e encontrei um que se chama array bidimensional.
Isso serviria para fazer este código?!