#include<stdio.h>
#include<Windows.h>
#pragma warning(disable : 4996)

// 상태를 위한 구조체
typedef struct
{
	int m;
	int c;
	char p;
}state;

// 상태를 초기화하기 위한 함수
void state_init(state* s)
{
	s->c = 2;
	s->m = 2;
	s->p = 'r';
}

// 상태 전이를 진행하는 함수
int state_moving(state* s, int m, int c)
{
	if (s->p == 'r')	// 배가 오른쪽에 있을 때
	{
		// 현재 상태가 (2, 2, R)일 때
		if (s->m == 2 && s->c == 2)
		{
			// 상태 (2, 2, R)로부터 입력 (0, 1)에 따른 상태 (2, 1, L)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 2;
				s->c = 1;
				s->p = 'l';
			}
			// 상태 (2, 2, R)로부터 입력 (0, 2)에 따른 상태 (2, 0, L)로의 전이
			else if (m == 0 && c == 2)
			{
				s->m = 2;
				s->c = 0;
				s->p = 'l';
			}
			// 상태 (2, 2, R)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 2, R)로부터 입력 (1, 1)에 따른 상태 (1, 1, L)로의 전이
			else if (m == 1 && c == 1)
			{
				s->m = 1;
				s->c = 1;
				s->p = 'l';
			}
			// 상태 (2, 2, R)로부터 입력 (2, 0)에 따른 상태 (0, 2, L)로의 전이
			else if (m == 2 && c == 0)
			{
				s->m = 0;
				s->c = 2;
				s->p = 'l';
			}
		}
		// 현재 상태가 (2, 1, R)일 때
		else if (s->m == 2 && s->c == 1)
		{
			// 상태 (2, 1, R)로부터 입력 (0, 1)에 따른 상태 (2, 0, L)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 2;
				s->c = 0;
				s->p = 'l';
			}
			// 상태 (2, 1, R)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 1, R)로부터 입력 (1, 0)에 따른 상태 (1, 1, L)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 1;
				s->c = 1;
				s->p = 'l';
			}
			// 상태 (2, 1, R)로부터 입력 (1, 1)에 따른 상태 (1, 0, L)로의 전이
			else if (m == 1 && c == 1)
			{
				s->m = 1;
				s->c = 0;
				s->p = 'l';
			}
			// 상태 (2, 1, R)로부터 입력 (2, 0)에 따른 상태 (0, 1, L)로의 전이
			else if (m == 2 && c == 0)
			{
				s->m = 0;
				s->c = 1;
				s->p = 'l';
			}
		}
		// 현재 상태가 (2, 0, R)일 때
		else if (s->m == 2 && s->c == 0)
		{
			// 상태 (2, 0, R)로부터 입력 (0, 1)에 따른 상태 종결이 불가능한 경우
			if (m == 0 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 0, R)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 0, R)로부터 입력 (1, 0)에 따른 상태 (1, 0, L)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 1;
				s->c = 0;
				s->p = 'l';
			}
			// 상태 (2, 0, R)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 0, R)로부터 입력 (2, 0)에 따라 상태 (0, 0, L)로 전이하고 종결 상태에 도달
			else if (m == 2 && c == 0)
			{
				s->m = 0;
				s->c = 0;
				s->p = 'l';
				printf("무사히 왼쪽 강가에 도달함.: \t축하합니다!!!");
				return 1;
			}
		}
		// 현재 상태가 (1, 1, R)일 때
		else if (s->m == 1 && s->c == 1)
		{
			// 상태 (1, 1, R)로부터 입력 (0, 1)에 따른 상태 (1, 0, L)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 1;
				s->c = 0;
				s->p = 'l';
			}
			// 상태 (1, 1, R)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (1, 1, R)로부터 입력 (1, 0)에 따른 상태 (0, 1, L)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 0;
				s->c = 1;
				s->p = 'l';
			}
			// 상태 (1, 1, R)로부터 입력 (1, 1)에 따라 상태 (0, 0, L)로 전이하고 종결 상태에 도달
			else if (m == 1 && c == 1)
			{
				s->m = 0;
				s->c = 0;
				s->p = 'l';
				printf("무사히 왼쪽 강가에 도달함.: \t축하합니다!!!");
				return 1;
			}
			// 상태 (1, 1, R)로부터 입력 (2, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
		// 현재 상태가 (0, 2, R)일 때
		else if (s->m == 0 && s->c == 2)
		{
			// 상태 (0, 2, R)로부터 입력 (0, 1)에 따른 상태 (0, 1, L)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 0;
				s->c = 1;
				s->p = 'l';
			}
			// 상태 (0, 2, R)로부터 입력 (0, 2)에 따라 상태 (0, 0, L)로 전이하고 종결 상태에 도달
			else if (m == 0 && c == 2)
			{
				s->m = 0;
				s->c = 0;
				s->p = 'l';
				printf("무사히 왼쪽 강가에 도달함. : \t축하합니다!!!");
				return 1;
			}
			// 상태 (0, 2, R)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 2, R)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 2, R)로부터 입력 (0, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
		// 현재 상태가 (0, 1, R)일 때
		else if (s->m == 0 && s->c == 1)
		{
			// 상태 (0, 1, R)로부터 입력 (0, 1)에 따라 상태 (0, 0, L)로 전이하고 종결 상태에 도달
			if (m == 0 && c == 1)
			{
				s->m = 0;
				s->c = 0;
				s->p = 'l';
				printf("무사히 왼쪽 강가에 도달함. : \t축하합니다!!!");
				return 1;
			}
			// 상태 (0, 1, R)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 1, R)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 1, R)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 1, R)로부터 입력 (2, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
	}
	else if (s->p == 'l')	// 배가 왼쪽에 있을 때
	{
		// 현재 상태가 (2, 1, L)일 때
		if (s->m == 2 && s->c == 1)
		{
			// 상태 (2, 1, L)로부터 입력 (0, 1)에 따른 상태 (2, 2, R)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 2;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (2, 1, L)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 1, L)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 1, L)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 1, L)로부터 입력 (2, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
		// 현재 상태가 (2, 0, L)일 때
		else if (s->m == 2 && s->c == 0)
		{
			// 상태 (2, 0, L)로부터 입력 (0, 1)에 따른 상태 (2, 1, R)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 2;
				s->c = 1;
				s->p = 'r';
			}
			// 상태 (2, 0, L)로부터 입력 (0, 2)에 따른 상태 (2, 2, R)로의 전이
			else if (m == 0 && c == 2)
			{
				s->m = 2;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (2, 0, L)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 0, L)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (2, 0, L)로부터 입력 (2, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
		// 현재 상태가 (1, 1, L)일 때
		else if (s->m == 1 && s->c == 1)
		{
			// 상태 (1, 1, L)로부터 입력 (0, 1)에 따른 상태 종결이 불가능한 경우
			if (m == 0 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (1, 1, L)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (1, 1, L)로부터 입력 (1, 0)에 따른 상태 (2, 1, R)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 2;
				s->c = 1;
				s->p = 'r';
			}
			// 상태 (1, 1, L)로부터 입력 (1, 1)에 따른 상태 (2, 2, R)로의 전이
			else if (m == 1 && c == 1)
			{
				s->m = 2;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (1, 1, L)로부터 입력 (2, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 2 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
		}
		// 현재 상태가 (0, 2, L)일 때
		else if (s->m == 0 && s->c == 2)
		{
			// 상태 (0, 2, L)로부터 입력 (0, 1)에 따른 상태 종결이 불가능한 경우
			if (m == 0 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 2, L)로부터 입력 (0, 2)에 따른 상태 (2, 2, R)로의 전이
			else if (m == 0 && c == 2)
			{
				s->m = 2;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (0, 2, L)로부터 입력 (1, 0)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 0)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 2, L)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 2, L)로부터 입력 (2, 0)에 따른 상태 (2, 2, R)로의 전이
			else if (m == 2 && c == 0)
			{
				s->m = 2;
				s->c = 2;
				s->p = 'r';
			}
		}
		// 현재 상태가 (0, 1, L)일 때
		else if (s->m == 0 && s->c == 1)
		{
			// 상태 (0, 1, L)로부터 입력 (0, 1)에 따른 상태 (0, 2, R)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 0;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (0, 1, L)로부터 입력 (0, 2)에 따른 상태 종결이 불가능한 경우
			else if (m == 0 && c == 2)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 1, L)로부터 입력 (1, 0)에 따른 상태 (0, 2, R)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 1;
				s->c = 1;
				s->p = 'r';
			}
			// 상태 (0, 1, L)로부터 입력 (1, 1)에 따른 상태 종결이 불가능한 경우
			else if (m == 1 && c == 1)
			{
				printf("식인종들이 선교사(들)을 잡아먹음!");
				return -1;
			}
			// 상태 (0, 1, L)로부터 입력 (2, 0)에 따른 상태 (1, 1, R)로의 전이

			else if (m == 2 && c == 0)
			{
				s->m = 1;
				s->c = 1;
				s->p = 'r';
			}
		}
		// 현재 상태가 (0, 0, L)일 때
		else if (s->m == 0 && s->c == 0)
		{
			// 상태 (0, 0, L)로부터 입력 (0, 1)에 따른 상태 (0, 1, R)로의 전이
			if (m == 0 && c == 1)
			{
				s->m = 0;
				s->c = 1;
				s->p = 'r';
			}
			// 상태 (0, 0, L)로부터 입력 (0, 2)에 따른 상태 (0, 2, R)로의 전이
			else if (m == 0 && c == 2)
			{
				s->m = 0;
				s->c = 2;
				s->p = 'r';
			}
			// 상태 (0, 0, L)로부터 입력 (1, 0)에 따른 상태 (1, 0, R)로의 전이
			else if (m == 1 && c == 0)
			{
				s->m = 1;
				s->c = 0;
				s->p = 'r';
			}
			// 상태 (0, 0, L)로부터 입력 (1, 1)에 따른 상태 (1, 1, R)로의 전이
			else if (m == 1 && c == 1)
			{
				s->m = 1;
				s->c = 1;
				s->p = 'r';
			}
			// 상태 (0, 0, L)로부터 입력 (2, 0)에 따른 상태 (2, 0, R)로의 전이
			else if (m == 2 && c == 0)
			{
				s->m = 2;
				s->c = 0;
				s->p = 'r';
			}
		}
	}
	return 0;
}


int main()
{
	int res = 0;
	int input_m, input_c;	// 선교사와 식인종의 총 인원수를 위한 변수(사용자 입력)
	state s;		// 구조체로 선언된 상태 객체를 선언
	state_init(&s);	// 시작 상태를 초기화
	// 인식 상태 (0, 0, L)에 도달하거나 종결이 불가능한 상태에 도달할 때까지 반복
	while (res == 0)
	{
		// 사용자로부터 알파벳을 입력받음
		printf("현재 상태 : (%d,%d,%c)\n", s.m, s.c, s.p);
		printf("승선 인원수를 입력하라. : ");
		scanf("%d %d", &input_m, &input_c);
		printf("입력 : (%d,%d)\n", input_m, input_c);
		// 입력된 알파벳을 바탕으로 전이하고 결과를 반환
		res = state_moving(&s, input_m, input_c);
	}
	// 마지막 상태를 출력
	printf("\n\n상태 : (%d,%d,%c)\n", s.m, s.c, s.p);
	system("PAUSE");
}