void combinacoes(int **matriz, int *custos, int num_parlamentares, int tam_partido, int temp[], int next, int size, int *preco_total) { int i; int tem, influenciados; if (size >= tam_partido) { *preco_total = 0; for (i = 0; i < tam_partido; i++) printf("%d ", temp[i]); printf("preco total = %d\n", *preco_total); } for (i = next; i <= num_parlamentares; i++) { /* Verifica se o parlamentar ja esta no partido */ tem = verifica (temp, size, i); /* Caso o parlamentar ainda nao esteja no partido ... */ if (tem == 0) { /* ... insere ele no vetor */ temp[size] = i; /* Veririca quantos e quais parlamentares ele influencia */ influenciados = influencias(matriz, i, num_parlamentares, size, temp); if (size + influenciados <= tam_partido) combinacoes(matriz, custos, num_parlamentares, tam_partido, temp, i + 1, size + influenciados, preco_total); } /* Caso o parlamentar a ja estivesse no partido */ else { combinacoes(matriz, custos, num_parlamentares, tam_partido, temp, i + 1, size, preco_total); } } }
int main() { /* Variaveis de entrada */ int num_parlamentares, tam_partido, *custos, **matriz; /* Variaveis de controle de laco */ int i, j; /* Variaveis auxiliares */ int preco_total = 0, *temp; /* Le a primeira linha da entrada */ scanf("%d %d", &num_parlamentares, &tam_partido); /* Aloca espaco para os custos dos parlamentares , para a matrize para temp */ custos = malloc(num_parlamentares * sizeof(int)); matriz = malloc( num_parlamentares * sizeof(int *)); for (i = 0; i < num_parlamentares; i++) matriz[i] = malloc (num_parlamentares * sizeof(int)); temp = malloc(tam_partido * sizeof(int)); /* Le o restante da entrada */ for (i = 0; i < num_parlamentares; i++) scanf("%d", &custos[i]); for (i = 0; i < num_parlamentares; i++) for (j = 0; j < num_parlamentares; j++) scanf("%d", &matriz[i][j]); combinacoes (matriz, custos, num_parlamentares, tam_partido, temp, 1, 0, &preco_total); return 0; }
tabuleiro *aleatorio(tabuleiro *tab,int before){ int lin,col,i,l,com=0,barexist,barconess, posicoes; int linhas[100],comb[100]; char tmp[100][100],local[100][100]; tabuleiro *f, *w, *z, *x; for(lin=0;lin!=tab->tamanho[0];lin++){ barexist=0; posicoes=0; for(col=0;col!=tab->tamanho[1];col++){ if(caniboat(tab,lin,col)) posicoes++; else if(tab->quadro[lin][col]!='~' && tab->quadro[lin][col]!='.') barexist++; } barconess=tab->linhas[lin]-barexist; comb[lin]=combinacoes(posicoes,barconess); } for(i=0;i!=tab->tamanho[0];i++) linhas[i]=i; ordena(comb,linhas,0,tab->tamanho[0]); for(i=0;comb[i]==0;i++); l=linhas[i]; com=0; for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) tmp[lin][col]=tab->quadro[lin][col]; do{ if(verifica(tab)==2) ; else if(verifica(tab)==0){ for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) tab->quadro[lin][col]=tmp[lin][col]; ++com; if(com>=comb[i]) {com=0; l=linhas[++i];} tab=aleoaux(tab,l,com); } else if(verifica(tab)==1){ ++com; if(com>=comb[i]) {com=0; l=linhas[++i];} tab=aleoaux(tab,l,com); } do{ for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) local[lin][col]=tab->quadro[lin][col]; f=aloca(tab); w=verigual(tab,estra1(f)); f=aloca(w); z=verigual(w,estra2(f)); f=aloca(z); x=verigual(z,estra3(f)); f=aloca(x); tab=verigual(x,estra4(f)); }while(changes(local,tab) && verifica(tab)!=2); if(verifica(tab)==0){ for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) tmp[lin][col]=tab->quadro[lin][col]; } if(before==1){ for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) tmp[lin][col]=tab->quadro[lin][col]; return tab; } else if(verifica(tab)!=2 && i+1==tab->tamanho[0]) tab=aleatorio(tab,1); if(dots(tab) || verifica(tab)!=2) { for(lin=0;lin!=tab->tamanho[0];lin++) for(col=0;col!=tab->tamanho[1];col++) tmp[lin][col]=tab->quadro[lin][col]; return tab; } }while(verifica(tab)!=2); return tab; }