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;
}