문제를 읽어보면,
a에서 b로 , a에서 c로 , b에서 a로 , b에서 c로
, c에서 a로 , c에서 b로 향하는 총 6가지 방법이 있다.
그리고 한번 체크를 했다면 다시 방문할 필요가 없기 때문에
결론
: bfs로 해야겠다는 판단을 함.
나의 경우는 dir을 풀어서 사용하는 것이 복잡하다고 느껴서
6번을 전부 일일이 진행함.
struct Bottle
{
int a, b, c;
};
vector<int> vResult;
queue<Bottle>q;
q.push({ 0,0,c });
visited[0][0][c] = true;
vResult.push_back(c);
while (!q.empty())
{
auto curV = q.front();
int aa = curV.a;
int bb = curV.b;
int cc = curV.c;
q.pop();
// aa 에서 bb로 줄때
if (aa + bb > b)
{
if (visited[aa + bb - b][b][cc] == false)
{
q.push({ aa + bb - b, b, cc });
visited[aa + bb - b][b][cc] = true;
if (aa + bb - b == 0)
vResult.push_back(cc);
}
}
else
{
if (visited[0][aa + bb][cc] == false)
{
q.push({ 0, aa + bb, cc });
visited[0][aa + bb][cc] = true;
vResult.push_back(cc);
}
}
// aa 에서 cc로 줄 때
if (aa + cc > c)
{
if (visited[aa + cc - c][bb][c] == false)
{
q.push({ aa + cc - c, bb, c });
visited[aa + cc - c][bb][c] = true;
if (aa + cc - c == 0 )
vResult.push_back(c);
}
}
else
{
if (visited[0][bb][aa + cc] == false)
{
q.push({ 0, bb, aa + cc });
visited[0][bb][aa + cc] = true;
vResult.push_back(aa + cc);
}
}
// bb 에서 aa로
if (aa + bb > a)
{
if (visited[a][aa + bb - a][cc] == false)
{
q.push({ a , aa + bb - a, cc });
visited[a][aa + bb - a][cc] = true;
if (a == 0)
vResult.push_back(cc);
}
}
else
{
if (visited[aa + bb][0][cc] == false)
{
q.push({ aa + bb, 0, cc });
visited[aa + bb][0][cc] = true;
if (aa + bb == 0)
vResult.push_back(cc);
}
}
// bb에서 cc로
if (bb + cc > c)
{
if (visited[aa][bb + cc - c][c] == false)
{
q.push({ aa , bb + cc - c, c });
visited[aa][bb + cc - c][c] = true;
if (aa == 0)
vResult.push_back(c);
}
}
else
{
if (visited[aa][0][bb + cc] == false)
{
q.push({ aa, 0, bb + cc });
visited[aa][0][bb + cc] = true;
if (aa == 0)
vResult.push_back(bb + cc);
}
}
// cc에서 aa로
if (aa + cc > a)
{
if (visited[a][bb][aa + cc - a] == false)
{
q.push({ a , bb, aa + cc - a });
visited[a][bb][aa + cc - a] = true;
if (a == 0)
vResult.push_back(aa + cc - a);
}
}
else
{
if (visited[aa + cc][bb][0] == false)
{
q.push({ aa + cc, bb, 0 });
visited[aa + cc][bb][0] = true;
if (aa + cc == 0)
vResult.push_back(0);
}
}
// cc 에서 bb로
if (bb + cc > b)
{
if (visited[aa][b][bb + cc - b] == false)
{
q.push({ aa , b, bb + cc - b });
visited[aa][b][bb + cc - b] = true;
if (aa == 0)
vResult.push_back(bb + cc - b);
}
}
else
{
if (visited[aa][bb + cc][0] == false)
{
q.push({ aa, bb + cc, 0 });
visited[aa][bb + cc][0] = true;
if (aa == 0)
vResult.push_back(0);
}
}
}