PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2016/10/11 22:26:59
Name 임수향
File #1 1.jpg (7.6 KB), Download : 20
Subject [질문] C언어 DFS 알고리즘 질문입니다.


안녕하세요.

하기 코드에 image와 같이 입력한다면

x=4, y=4일 때 dfs 함수의 첫 번째 if문 조건이 true가 되므로 이하 문장이 실행될 텐데

return 되면 그 이후엔 dfs 함수에서 빠져나오는 것 맞나요?

코드를 자세히 확인 해보니까 그게 아닌 것 같아서요.

C언어 초보를 위해 자세한 설명 부탁 드립니다.

코드 :

#include <stdio.h>

int n, min; // 맵의 크기와 최소값을 나타내는 변수
int map[10][10]; // 맵을 나타내는 2차원 배열

void dfs(int x, int y, int l);

int main()
{
    int i, j;
    scanf_s("%d", &n);
    min = n * n; // 모든 경로를 돌아다녀도 n * n이니, 이를 최소값으로 지정해둔다
    for (i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
                {
            scanf_s("%d", &map[i][j]);
                }
        }
    dfs(0, 0, 1); // DFS 시작!
    printf("최단 거리: %dn", min);
    return 0;
}
void dfs(int x, int y, int l)
{
        int a, b;
    // 도착 지점에 도착했을 경우
    if ((x==n-1)&&(y==n-1))
    {
        // 현재 최소값이 l보다 크면, l이 작은 것이므로 l를 최소값으로 지정
        if (min > l)
                {
                        min = l;
                }
        return;
    }
    map[x][y] = 0; // 방문했음을 표시하기 위해 0을 대입
    // 위 이동할 수 있다면 이동!
    if (x > 0 && map[x - 1][y] != 0)
        {
                dfs(x - 1, y, l + 1);
        }
    // 아래쪽 이동할 수 있다면 이동!
    if (x < n - 1 && map[x + 1][y] != 0)
        {
                dfs(x + 1, y, l + 1);
        }
    // 왼쪽으로 이동할 수 있다면 이동!
    if (y > 0 && map[x][y - 1] != 0)
        {
                dfs(x, y - 1, l + 1);
        }
    // 오른으로 이동할 수 있다면 이동!
    if (y < n - 1 && map[x][y + 1] != 0)
        {
                dfs(x, y + 1, l + 1);
        }
    map[x][y] = 1; // 지나간 자리를 원상태로 되돌리기 위해 1을 대입
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
다이어트
16/10/11 23:07
수정 아이콘
리턴이 되면 호출했던 함수 아래로 다시 돌아가게 되고 저 함수의 경우에는 최단거리 찾아도 계속해서
탐색을 하게 될것 같네요. 보통은 효율성을 위해 제일 첫줄에 if (l > min) return; 같은 구문을 넣어서 비효율적인 길은
더 이상 탐색 안하도록 처리하긴 합니다.
16/10/12 00:02
수정 아이콘
말로 설명하기가 그르네요

상하좌우 이동하고 걸리는 탈출조건문에서 return 후에는 다시 이전 stack으로 돌아가서 다음 방향으로 이동합니다.
임수향
16/10/12 07:32
수정 아이콘
다음 방향이 의미하는 바가 뭐죠?
16/10/12 01:53
수정 아이콘
이거 말로 설명하기가 진짜 어렵네요 크크
재귀함수 호출이기 때문에 이전에 호출했던 dfs함수의 다음 구문이 실행됩니다.
BFS랑 트리검색알고리즘을 위해서 필수로 이해하고 넘어가시면 좋습니다.
순서대로 그림을 그리면서 흐름을 따라가보는게 가장 좋다고 생각합니다. 기술면접시 칠판에다가 코딩해놓고 그런식으로 따라가면서 설명해보라고 하기도 하거든요.
그런데 이것을 깨닫는건 진짜 한순간의 번쩍임입니다 크크
임수향
16/10/12 07:33
수정 아이콘
다음 구문이 의미하는 바가 뭐죠? return 아래 구문이 실행 된다는 건가요?
16/10/12 07:37
수정 아이콘
return이 나오면 dfs 함수는 끝나는거죠. 그러니 dfs 함수를 호출했던 이전 dfs 함수 내의 다음 구문입니다. n번째 호출되는 dfs에서 return이 일어났으면 n-1번째 dfs 함수 안입니다.
예를 들면:
/*생략*/
if (x > 0 && map[x - 1][y] != 0)
{
dfs(x - 1, y, l + 1); // Unikys: n-1번째 dfs 실행 중 n번째 dfs 함수를 호출했는데 return이 되었다면,
}
// 아래쪽 이동할 수 있다면 이동! // Unikys: n-1번째 dfs 함수에 여기(다음구문)부터 이어서 실행이 되는겁니다. 스택구조로 생각하시면 됩니다.
if (x < n - 1 && map[x + 1][y] != 0)
{
dfs(x + 1, y, l + 1);
}

댓글만 보고는 바로 이해하기 힘드실거고 함수가 재쉬적으로 호출되는 스택구조와 map[][]의 변화를 그려가면서 이해해보세요.
임수향
16/10/12 20:50
수정 아이콘
도움 많이 되었습니다. 감사합니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
94006 [질문] [스타1] 방금 만든 맵인데 피지알분들에게 평가를 받아보고 싶습니다. [18] 삭제됨2422 16/11/30 2422
94005 [질문] 음악을 찾습니다(음계밖에 모릅니다) cadenza791784 16/11/30 1784
94004 [질문] 소개팅 후 대처 질문입니다. [8] WOGUS883115 16/11/30 3115
94003 [질문] [연애]여자사람친구와 애매한 관계... 어떻게 매듭을 지어야 할까요? [37] 삭제됨9080 16/11/30 9080
94002 [질문] 구글드라이브에 영상 올리면 아이폰에서 스트리밍으로 바로 볼 수 있나요 ? [1] -Aka7258 16/11/30 7258
94001 [질문] 예비군 전투모 [6] 타마노코시4799 16/11/30 4799
94000 [질문] 마우스 번지대 추천좀 해주세요! [5] 마둘리6739 16/11/30 6739
93999 [질문] 혹시.... 대사만 가지고 어떤 드라마(영화)인지 맞춰주실 분 있나요?? [7] 마눌2314 16/11/29 2314
93998 [질문] 타오바오 직구 해보신 분들께 질문드립니다. [2] 이사무2183 16/11/29 2183
93997 [질문] 한 교실에서 블루투스 키보드를 30개 정도 쓸 수 있나요? [8] 참된깨달음2418 16/11/29 2418
93996 [질문] 말을 잘하고 되고싶습니다.(심각) [2] 물리쟁이3064 16/11/29 3064
93995 [질문] 현재 커쇼가 우리나라고교야구에 뛴다면? [24] 백양로폭주3396 16/11/29 3396
93994 [질문] 캐드, 캠을 연습하기 위한 컴퓨터를 마련하고 싶은데요 [10] 아리아리해2256 16/11/29 2256
93993 [질문] 업무 및 학업용 PC 견적 질문입니다. [4] 딱총새우1692 16/11/29 1692
93992 [질문] 박근혜대통령 하야시 대통령기록물 열람 관련 질문 [1] 삭제됨3345 16/11/29 3345
93991 [질문] KBD39 기계식 키보드 고민 중입니다. [12] 주머니속에그거..2640 16/11/29 2640
93990 [질문] 취업 고민입니다 [7] 삭제됨3182 16/11/29 3182
93989 [질문] 여러분들 보통 몇시에일어나십니까?? [24] 장수풍뎅이4393 16/11/29 4393
93988 [질문] 예비군3년차 질문드립니다 [5] 마브라브2154 16/11/29 2154
93987 [질문] 플스4 pro 구매계획 중입니다 [5] Paul Pogba2212 16/11/29 2212
93986 [질문] 부총리와 총리가 어떻게 다른가요? [6] 택배1998 16/11/29 1998
93985 [질문] 면 없이 라면을 끓이면 맛이 어떤가요???? [13] 시작버튼15692 16/11/29 15692
93984 [질문] 안전성 높은 자동차는 어떤게 있을까요? [8] Tristana3853 16/11/29 3853
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로