#pragma once
#include <iostream>
#include <set>
#include <list>
class C_MOUNTAIN
{
public:
enum class E_TYPE
{
E_PATH = 0,
E_GATE,
E_SUMMIT,
};
private:
struct S_NODE
{
std::set<int> child;
E_TYPE eType;
};
S_NODE** m_arNode;
int** m_arIntentsity{};
std::set<int> m_setEnalbeNode;
std::list<int> m_listPath;
private:
S_NODE* createNode(int nId);
void move(int nParent, int nId, int nIntensity);
public:
C_MOUNTAIN() = default;
void addPath(int nDst, int nSrc, int nIntensity);
void init(int nSize);
void setType(int nId, E_TYPE eType);
void print();
void run(int nGate);
};
#include "mountain.h"
C_MOUNTAIN::S_NODE* C_MOUNTAIN::createNode(int nId)
{
S_NODE* pNode = new S_NODE{};
pNode->eType = C_MOUNTAIN::E_TYPE::E_PATH;
return pNode;
}
void C_MOUNTAIN::run(int nGate)
{
move(0, nGate, 0);
}
void C_MOUNTAIN::move(int nParent, int nId, int nIntensity)
{
/*printf("id : %d , intensity : %d\n", nId, m_arIntentsity[nId][nParent]);*/
S_NODE* pNode = m_arNode[nId];
if (pNode->eType == E_TYPE::E_SUMMIT)
{
for (int nPath : m_listPath)
{
printf("%d ", nPath);
}
printf("result : %d\n", nIntensity);
return;
}
for (int nChild : pNode->child)
{
S_NODE* pChild = m_arNode[nChild];
if (nChild != nParent && pChild->eType != E_TYPE::E_GATE)
{
m_listPath.push_back(nChild);
if (nIntensity < m_arIntentsity[nId][nChild])
move(nId, nChild, m_arIntentsity[nId][nChild]);
else
move(nId, nChild, nIntensity);
m_listPath.pop_back();
}
}
}
void C_MOUNTAIN::init(int nSize)
{
m_arNode = new S_NODE * [nSize] {};
m_arIntentsity = new int* [nSize] {};
for (int i = 0; i < nSize; i++)
{
m_arIntentsity[i] = new int[nSize] {};
}
}
void C_MOUNTAIN::addPath(int nDst, int nSrc, int nIntensity)
{
if (!m_arNode[nDst])
m_arNode[nDst] = createNode(nDst);
if (!m_arNode[nSrc])
m_arNode[nSrc] = createNode(nSrc);
m_setEnalbeNode.insert(nDst);
m_setEnalbeNode.insert(nSrc);
m_arNode[nDst]->child.insert(nSrc);
m_arNode[nSrc]->child.insert(nDst);
m_arIntentsity[nDst][nSrc] = nIntensity;
m_arIntentsity[nSrc][nDst] = nIntensity;
}
void C_MOUNTAIN::setType(int nId, E_TYPE eType)
{
m_arNode[nId]->eType = eType;
}
void C_MOUNTAIN::print()
{
for (int nId : m_setEnalbeNode)
{
printf("%d : ", nId);
for (int nChild : m_arNode[nId]->child)
{
printf("%d ", nChild);
}
printf("\n");
}
}
#include <iostream>
#include "mountain.h"
int main()
{
C_MOUNTAIN cMountain{};
cMountain.init(10);
cMountain.addPath(1, 2, 3);
cMountain.addPath(2, 3, 5);
cMountain.addPath(2, 4, 2);
cMountain.addPath(2, 5, 4);
cMountain.addPath(3, 4, 4);
cMountain.addPath(4, 5, 3);
cMountain.addPath(4, 6, 1);
cMountain.addPath(5, 6, 1);
cMountain.setType(1, C_MOUNTAIN::E_TYPE::E_GATE);
cMountain.setType(3, C_MOUNTAIN::E_TYPE::E_GATE);
cMountain.setType(5, C_MOUNTAIN::E_TYPE::E_SUMMIT);
//cMountain.print();
cMountain.run(3);
}
'C++' 카테고리의 다른 글
[C++] 5월 9일 코딩 테스트 수업 (0) | 2025.05.09 |
---|---|
[C++] 5월 2일 코딩 테스트 수업 (0) | 2025.05.02 |
[C++] 4월 28일 코딩 테스트 수업 (0) | 2025.04.29 |
[C++] 4월 25일 코딩 테스트 수업 (0) | 2025.04.27 |
[C++] 4월 23일 코딩 테스트 수업 (0) | 2025.04.24 |