#include <stdio.h>
#include <string.h>
char magic[21]; //마법의 두루마리에 적힌 문자열
char angel[101], devil[101]; //천사의 돌다리, 악마의 돌다리
int cnt=0, magic_len, angel_len, devil_len;
void start_devil(void); //악마의 돌다리에서 출발하는 경우
void start_angel(void); //천사의 돌다리에서 출발하는 경우
int re(int a, int where_ston, int next);
//a=현재 배열 번호 where_ston=현재 위치한 돌다리(1:악마 2:천사) next=다음 가야할 칸의 두루마리 번호
//void len_cut(void);
int main(void)
{
//입력 시작
scanf("%s", magic);
scanf("%s", devil);
scanf("%s", angel);
//입력 종료
//문자열의 길이 구하기
magic_len=strlen(magic);
angel_len=strlen(angel);
//devil_len=strlen(devil);
//len_cut();
//printf("%d %d %d \n", magic_len, angel_len, devil_len);
start_devil(); //악마의 돌다리에서 출발하는 경우
start_angel(); //천사의 돌다리에서 출발하는 경우
printf("%d", cnt);
return 0;
}
void start_devil(void)
{
int i;
for(i=0; i<=(angel_len-magic_len); i++)
{
if(devil[i]==magic[0]) //악마의 돌다리에서 시작 위치
{
//printf("start_devil: %d \n", i);
re(i, 1, 1);
}
}
}
void start_angel(void)
{
int i;
for(i=0; i<=(angel_len-magic_len); i++)
{
if(angel[i]==magic[0]) //천사의 돌다리에서 시작 위치
{
//printf("start_angel: %d \n", i);
re(i, 2, 1);
}
}
}
int re(int a, int where_ston, int next)
{
int i;
if(next==magic_len) //돌다리를 모두 건넌 경우
{
cnt++;
return 0;
}
if(where_ston==1) //악마의 돌다리 위에 있는 경우 다음 돌다리는 천사의 돌다리
{
if(a==angel_len || (angel_len-a)<(magic_len-next)) //건너야 할 돌다리가 남은 돌다리 개수보다 적은 경우
return 0;
for(i=a+1; i<=(angel_len-(magic_len-next)); i++)
{
if(angel[i]==magic[next]) //다음으로 건널 돌다리 위치
{
//printf("i=%d next=%d \n", i, next);
re(i, 2, next+1);
}
}
}
else //천사의 돌다리 위에 있는 경우 다음 돌다리는 악마의 돌다리
{
if(a==angel_len || (angel_len-a)<(magic_len-next)) //건너야 할 돌다리가 남은 돌다리 개수보다 적은 경우
return 0;
for(i=a+1; i<=(angel_len-(magic_len-next)); i++)
{
if(devil[i]==magic[next]) //다음으로 건널 돌다리 위치
{
//printf("i=%d next=%d \n", i, next);
re(i, 1, next+1);
}
}
}
return 0;
}
/*
void len_cut(void)
{
int i;
for(i=angel_len-1; i>=0; i--)
{
if(angel[i]==magic[magic_len-1])
{
angel_len=i+1;
break;
}
}
for(i=devil_len-1; i>=0; i--)
{
if(devil[i]==magic[magic_len-1])
{
devil_len=i+1;
break;
}
}
if(angel_len>devil_len)
devil_len=angel_len;
else
angel_len=devil_len;
}*/
2018.04.07 11:23
정올 - 알고리즘 - 돌다리건너기(1014) - Time Limit Exceed
조회 수 476 추천 수 0 댓글 0