농부, 배추, 염소, 늑대 강건너기

2025. 10. 1. 21:00·개인 코테 & 스타디 <비공개>/알고리즘 스타디 과제

(해당글은 완성된글이 아닙니다)

 

문제

농부, 염소, 배추, 늑대가 강의 오른편에있다

배를 이용하여 강의 왼편으로 건너야한다

항상 농부가 타야한다

늑대나 염소 배추 중에서 한개만 실을수 있으며 동시에 다수를 실을순없다

농부가 없을때는 늑대가 염소를 염소는 배추를 먹어버린다

 

 

푸는방식 : DFS를 통하여 Stack을 사용하여 경우의 수를 저장하고

마지막으로 넣은값을 확인하고 해당값이 잘못된값이면 스택에서 값을 되돌려

아직 빼지않은 경우의 수를 다시 확인해본다

 

 

 

비트연산자로 표기한다

32 16 8 4 2 1 일테니

0x01, 0x02, 0x04, 0x08 

2 ^ 4 = 16

16 -> 0x10 ㅠ

 

코드가 아직 수정중입니다

#include <iostream>
#include <stdio.h>
#include <set>

using namespace std;
set<int> m_arVisited;

class C_GAME
{
public:
	enum 
	{
		E_CABBAGE	= 0x01,
		E_GOAT		= 0x02,
		E_FARMER	= 0x04,
		E_WOLF		= 0x08,
		E_MAX		= 0x10
	};
	
};
//오른쪽땅 (1) |  왼쪽땅 (0)
bool bCrossSuccess(int nData)
{
	//존재해야하며 전부 왼쪽 0 일때 성공 XOR
	int bitMask = C_GAME::E_CABBAGE | C_GAME::E_GOAT | C_GAME::E_FARMER | C_GAME::E_WOLF;
	return (nData & bitMask) == 0;
}

bool bValidSituation(int nData)
{
	bool s_CABBAGE	= (nData & C_GAME::E_CABBAGE) != 0;
	bool s_GOAT = (nData & C_GAME::E_GOAT) != 0;
	bool s_Farmer = (nData & C_GAME::E_FARMER) != 0;
	bool s_Wolf = (nData & C_GAME::E_WOLF) != 0;

	//농부가 없으면( 늑대 -> 염소 x) (염소 -> 배추 x)
	if (!s_Farmer)
	{
		if (s_Wolf == s_GOAT)
			return false;
		if (s_GOAT == s_CABBAGE)
			return false;
	}
	return true;
}
int DFS(int nData)
{
	if (m_arVisited.count(nData))
		return -1;
	m_arVisited.insert(nData);

	if (bCrossSuccess(nData))
	{
		printf("강 건너기 성공\n" );
		return 0;
	}

	//농부 왼 오른쪽 체크
	bool pos_Farmer = (nData & C_GAME::E_FARMER) != 0;

	int next = nData ^ C_GAME::E_FARMER;
	if (bValidSituation(next))
	{
		int result = DFS(next);
		if (result != -1)
			return result + 1;
	}
	//농부 + 늑대 경우
	if (((nData & C_GAME::E_WOLF) != 0) == pos_Farmer)
	{
		int nextWolf = nData ^ (C_GAME::E_FARMER | C_GAME::E_WOLF);
		if (bValidSituation(nextWolf))
		{
			int result = DFS(nextWolf);
			if (result != -1)
				return result + 1;
		}
	}
	//농부 + 염소 경우
	if (((nData & C_GAME::E_GOAT) != 0) == pos_Farmer)
	{
		int nextGoat = nData ^ (C_GAME::E_FARMER | C_GAME::E_GOAT);
		if (bValidSituation(nextGoat))
		{
			int result = DFS(nextGoat);
			if (result != -1)
				return result + 1;
		}
	}
	//농부 + 배추 경우
	if (((nData & C_GAME::E_CABBAGE) != 0) == pos_Farmer)
	{
		int nextCabbage = nData ^ (C_GAME::E_FARMER | C_GAME::E_CABBAGE);
		if (bValidSituation(nextCabbage))
		{
			int result = DFS(nextCabbage);
			if (result != -1)
				return result + 1;
		}
	}
	return -1;
}
int main()
{
	// 초기 상태: 모두 오른쪽 강가 (비트가 1이면 오른쪽)
	int startState = C_GAME::E_CABBAGE | C_GAME::E_GOAT | C_GAME::E_FARMER | C_GAME::E_WOLF;

	int result = DFS(startState);

	if (result != -1)
		printf("총 이동 횟수: %d\n", result);
	else
		printf("강을 건널 수 없습니다.\n");

	return 0;
}

 

 

참고)

https://blog.naver.com/rlaalsdn456456/221676020039

 

농부, 배추, 염소, 늑대 강건너기 - DFS (파이썬)

흔히들 이런 문제 수학 문제 풀면서 재미로 쉬어가는 퀴즈로 보았을 것이다. 다음 문제에서 조건은 다음과 ...

blog.naver.com

 

'개인 코테 & 스타디 <비공개> > 알고리즘 스타디 과제' 카테고리의 다른 글

과제 - 재귀함수 계산기 만들기  (0) 2025.09.24
과제 - 자료구조(Data Struct)  (1) 2025.09.14
'개인 코테 & 스타디 <비공개>/알고리즘 스타디 과제' 카테고리의 다른 글
  • 과제 - 재귀함수 계산기 만들기
  • 과제 - 자료구조(Data Struct)
lucodev
lucodev
언리얼 포폴개발 일기
  • lucodev
    루코 개발테이블
    lucodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (213) N
      • Unreal 프로젝트 다이어리 (110) N
        • 첫번째 프로젝트 (73)
        • 두번째 프로젝트 (37) N
      • Unreal 팁 (8)
      • Unreal 디버깅 (8)
      • C++ 프로그래머스 (52)
        • Stack,Queue (7)
        • Hash (4)
        • Heap (2)
        • Sort (5)
        • Exhaustive search (5)
        • Greedy (2)
        • BFS , DFS (7)
        • Graph (2)
        • Dynamic Programming (1)
        • C++ Math (2)
        • 기타 문제 (14)
      • C++ 백준 (4)
      • C++ 팁 (1)
      • 개인 코테 & 스타디 <비공개> (29)
        • 코드 개인보관함 (9)
        • 코딩테스트+@ (11)
        • 알고리즘 스타디 (6)
        • 알고리즘 스타디 과제 (3)
        • 비공개 (0)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 링크

  • 공지사항

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 태그

    언리얼 비헤이비어트리
    언리얼 behavior tree
    언리얼 프로그래스바
    언리얼 motionmatching
    unreal
    언리얼 behaviortree
    언리얼 컷씬
    unreal 시퀀스
    unreal 파쿠르
    unreal 모션매칭
    언리얼 파쿠르
    unreal inventory
    언리얼 모션매칭
    언리얼 parkour
    언리얼 인벤토리
    언리얼
    언리얼 시퀀스
    Unreal Parkour
    언리얼 ui
    unreal 인벤토리
  • hELLO· Designed By정상우.v4.10.3
lucodev
농부, 배추, 염소, 늑대 강건너기
상단으로

티스토리툴바