10.2.2 순열 문제 소스 코드
다음은 앞에서 작성한 순열 문제의 소스 코드입니다.
//Heuristic.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> Bucket;
typedef Bucket::iterator BIter;
typedef Bucket::const_iterator CBIter;
class Heuristic;
typedef vector<Heuristic *> Heues;
typedef Heues::iterator HIter;
typedef Heues::const_iterator CHIter;
class Heuristic
{
Bucket original;
Bucket out;
public:
Heuristic(Bucket bucket);
Heues EnumNext();
void View()const;
bool IsEmpty()const;
private:
Heuristic(const Heuristic *bheu,int ball);
};
//Heuristic.cpp
#include "Heuristic.h"
Heuristic::Heuristic(Bucket bucket)
{
original = bucket;
}
Heues Heuristic::EnumNext()
{
Heues heues;
BIter seek = original.begin();
BIter last = original.end();
for( ;seek != last ; ++seek)
{
//하나의 공을 꺼낸 경험 정보를 생성하여 보관
heues.push_back(new Heuristic(this,*seek));
}
return heues;
}
void Heuristic::View()const
{
CBIter seek = out.begin();
CBIter last = out.end();
for( ;seek != last ; ++seek)
{
cout<<(*seek)<<" ";
}
cout<<endl;
}
bool Heuristic::IsEmpty()const
{
return original.empty(); //바구니가 비었는지 판별
}
Heuristic::Heuristic(const Heuristic *bheu,int ball)
{
out = bheu->out;
original = bheu->original;
BIter seek = original.begin();
BIter last = original.end();
for( ;seek != last; ++seek)
{
if((*seek)==ball) //seek위치의 공과 ball이 같으면
{
original.erase(seek);//공을 꺼냄
out.push_back(ball);//꺼낸 바구니에 보관
break;
}
}
}
//Program.cpp
#include "Heuristic.h"
#include <stack>
using namespace std;
int main()
{
stack<Heuristic *> hs;
Bucket bucket;
for(int i = 0; i<10;i++)
{
bucket.push_back(i);
}
Heuristic *heu = new Heuristic(bucket);//hs.push(0~9까지 공을 보관한 초기 경험 정보를 생성
hs.push(heu);//스택에 보관
while(hs.empty() == false) //반복(스택이 비어 있지 않다면)
{
heu = hs.top();//스택에서 경험 정보 꺼내옮
hs.pop();
Heues nheues = heu->EnumNext();//스택에서 꺼내온 경험 정보에서 다음 경험 목록 조사
HIter seek = nheues.begin();
HIter last = nheues.end();
for( ;seek != last; ++seek)//반복(다음 경험 목록을 순차적으로 반복)
{
if((*seek)->IsEmpty())//바구니에 공이 비면
{
(*seek)->View();//결과 출력
delete (*seek);
}
else//그렇지 않다면
{
hs.push(*seek);//스택에 보관
}
}
delete heu;
}
return 0;
}
'언어 자료구조 알고리즘 > [C++]디딤돌 자료구조와 알고리즘' 카테고리의 다른 글
10.4 깊이 우선 탐색(정점과 간선 그래프) (0) | 2016.04.11 |
---|---|
10.3.3 깊이 우선 탐색(인접 행렬) 코드 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10.3.2 깊이 우선 탐색(인접 행렬) 구현 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10.3.1 그래프 구현 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10.3 인접 행렬을 이용한 깊이 우선 탐색 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10.2.1 순열 문제 구현 (0) | 2016.04.11 |
10. 2 순열 문제 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10.1 피보나치 수열 [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
10. 동적 프로그래밍(DYNAMIC PROGRAMMING) [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.11 |
9.4 병합 정렬(Merge Sort) [디딤돌 자료구조와 알고리즘 with C++] (0) | 2016.04.04 |