문제 B:[귀속 입문] 조합의 출력
제목
문제 B: [귀속 입문] 조합의 출력 시간 제한: 1 Sec 메모리 제한: 128MB 제출: 1062 해결: 655 [제출] [상태] [토론판] [명제인: 외부 도입] 제목 설명 배열과 조합은 자주 사용하는 수학 방법이다. 그 중에서 조합은 n개의 원소에서 r개의 원소(순서와 r<=n)를 추출하는 것이다. 우리는 n개의 원소를 간단하게 자연수 1, 2,..., n으로 이해할 수 있다.현재 당신은 귀속적인 방법으로 모든 조합을 출력하지 않아도 됩니다.예를 들어 n=5, r=3, 모든 조합은 1 2 3 1 2 4 1 2 5 1 3 4 1 4 5 2 3 2 3 5 2 3 5 2 4 5 5 5 5 입력 한 줄 두 개의 자연수 n, r(1 < n < 21, 1 < = r < = n).
모든 조합을 출력하고, 모든 조합이 한 줄을 차지하며, 그 중의 요소는 작은 것부터 큰 것까지 순서대로 배열하고, 모든 조합도 사전 순서대로 배열한다.
2 참조 코드
#include
const int MAXN = 100;
bool hashTable[MAXN] = {false};
int A[MAXN];
int N, R;
void BFS(int index, int r){//r:
if(r == R + 1) {
for (int i = 1; i != R + 1; ++i)
{
printf("%d ", A[i]);
if(i <= R) printf(" ");
}
printf("
");
return;
}
for (int i = index; i <= N; ++i)// index~N P[r]
{
if(hashTable[i] == false){
A[r] = i;// A r i
hashTable[i] = true;
BFS(i, r + 1);
hashTable[i] = false;
}
}
}
int main(){
scanf("%d%d", &N, &R);
BFS(1, 1);
return 0;
}
#include
#include
#include
using std::stack;
using std::vector;
vector<int> vec;
stack<int> S;
int N, R;
void BFS(int index){
S.push(index);// vec
vec.push_back(index);//
int x;
bool popFlag = false;//
while(!S.empty()){
if(vec.size() == R){
for (vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
if(it != vec.begin()){
printf(" ");
}
printf("%d", *it);
}
printf("
");
popFlag = true;
}
x = S.top();
if(x == N){// 1~N , ,
// 1、2、5 2、5, 2
// 1、4、5 4、5, 4
S.pop();
vec.pop_back();
popFlag = true;
continue;
}
if(popFlag == true){
S.pop();
vec.pop_back();
popFlag = false;
}
if(x < N){
S.push(x + 1);
vec.push_back(x + 1);
}
}
}
int main(){
scanf("%d%d", &N, &R);
BFS(1);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
DFS(깊이우선탐색), BFS(너비우선탐색)그래프와 트리 그래프(graph) 정점(node)과 그 정점을 연결하는 간선(edge)로 이루어진 자료구조의 일종 그래프를 탐색한다는 것은 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것 트...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.