Informática Orsay Yitong 1317: [Exemplo 5.2] DFs combinados de pesquisa de saída e retorno (粑粑)

1317: [Exemplo 5.2] Saída combinada

Limite de tempo: 1000 ms Limite de memória: 65536 KB
Compromissos: 13575 Passos: 6581
[Descrição do título]
Arranjo e combinação é um método matemático comumente usado, no qual a combinação é extrair elementos r de n elementos (sem ordem e r≤ n), podemos simplesmente entender n elementos como números naturais 1, 2, ..., n e tirar qualquer número r deles.

Agora você é obrigado a produzir todas as combinações de maneira recursiva.

Por exemplo, n = 5, r = 3, todas as combinações são:

1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

[Entrada]
Dois números naturais n e r em uma linha (1 <n <21, 1≤r≤n).

[Saída] Para
todas as combinações, cada combinação ocupa uma linha e os elementos nela são organizados em ordem crescente. Cada elemento ocupa três caracteres. Todas as combinações também estão em ordem de dicionário.

[Entrada de amostra]
5 3
[Saída de amostra]
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5


Use a matriz b para determinar se o número nessa posição foi usado e use a [k] para armazenar o número determinado.
Por exemplo, saída 1 2 4
a [1] = 1, a [2] = 2, a [3] = 4
b [1] = 1, b [2] = 1, b [4] = 1

Baba não entendeu a princípio, como usar dfs aqui, e então a criança disse a Baba como entender.

A chave é o primeiro loop no código dfs, se você seguir o exemplo de um livro (página 245, o livro original é para int i = 1; agora é para int i = a [k-1] +1;), print Ele sai não apenas do pequeno para o grande, mas também contém 5 4 3 assim, do grande para o pequeno número.

Como a criança.


#include<bits/stdc++.h>
#define N 22
using namespace std; 
int num=0,a[10001]={0},n,r;
bool b[10001]={0};
int dfs(int);
int print();
int main(){
	freopen("cpp.in","r",stdin);
	freopen("cpp.out","w",stdout);
    cin>>n>>r; 
    dfs(1);
    return 0;
}
int dfs(int k){
	int i;
	for(i=a[k-1]+1;i<=n;i++){
		if(!b[i]){
			a[k]=i;
			b[i]=1;
			if(k==r){
				print();
			}
			else {
				dfs(k+1);
			}
			b[i]=0;
		}
	}
}
int print(){
	num++;
	for(int i=1;i<=r;i++){
		cout<<setw(3)<<a[i];
	}
	cout<<endl;
}
Publicado 33 artigos originais · gostei 0 · visitas 167

Acho que você gosta

Origin blog.csdn.net/weixin_42790071/article/details/105530215
Recomendado
Clasificación