언어 자료구조 알고리즘/[C++]디딤돌 자료구조와 알고리즘

10.2.2 순열 문제 소스 코드 [디딤돌 자료구조와 알고리즘 with C++]

언제나휴일 2016. 4. 11. 22:05
반응형

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;

}

반응형