PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2005/05/24 17:01:05
Name Turbo
Subject 할 일 없으신분들;; 간단한 c 프로그래밍
학교에서 미로찾기 프로그램을 짜오라는데 ;;
0,1로 된 지도를 주고
시작점과 도착점을 지정하면 그 사이의 길을 찾고 거리를 구하게 하려는데

스택을 쓰라는데 잘 몰라서 때려치우고
가는 길을 2로 바꾸고 그냥 한칸 갈때마다 숫자를 하나씩 더하게 하는데

다른건 다 대는데
중간에 길이 있는데도 길이 없다고 나와요 ㅠㅠ

예를들어 왼쪽위끝점 (0,0)에서 오른쪽아래끝점(15,15)까지 가게 하면 길 없다고 하고
(3,15)에서 (0,0)까지 가게 해도 길이 없다고 하고...
그런데 (0,0)부터 (3,15)까지는 또 잘 되고....
이렇게 어떤 지점은 되고 어떤 지점은 안되고.......

수업좀 제대로좀 나갈걸... 뭔가 크게 잘못한 느낌;;;

==========================================

#include <stdio.h>

int start1, start2; /*시작점 좌표*/
int end1, end2; /*도착점 좌표*/
int a;
int b;
int length = 0;

void Point();
void Point2();


void Findpath();

void Moveright();
void Movedown();
void Moveleft();
void Moveup();

void Backright();
void Backdown();
void Backleft();
void Backup();

void Finish();
void Noway();




/*맵 정보*/
int map[16][16] = {
{1,1,1,0,0,0,0,1,1,0,1,0,1,1,1,1},
{0,0,1,0,1,1,1,1,0,0,1,0,1,0,1,1},
{0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0},
{1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1},
{1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1},
{0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1},
{0,0,1,0,0,1,1,1,0,1,1,0,1,0,0,1},
{0,0,1,1,0,0,1,0,0,0,1,0,1,0,0,1},
{0,0,1,0,0,0,1,1,1,1,1,0,1,1,0,1},
{0,0,1,0,1,0,0,0,0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1,1,1,1,0,1,1,1,1},
{1,1,1,0,1,1,0,1,0,1,0,0,1,0,0,1},
{1,0,0,0,0,1,0,1,0,1,0,0,1,1,0,1},
{1,0,1,0,1,1,1,1,0,1,0,0,0,1,0,1},
{1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1},
};





/*Main 함수*/
void main()
{                                                          
        int i;


        printf("미로 찾기 프로그램입니다.\n");
        printf("미로의 정보는 다음과 같습니다.\n\n");
        
        for(i = 0; i < 16; i++){
                printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",map[i][0],map[i][1],map[i][2],map[i][3],map[i][4],map[i][5],map[i][6],map[i][7],map[i][8],map[i][9],map[i][10],map[i][11],map[i][12],map[i][13],map[i][14],map[i][15]);
        }

        Point(); /*여기까지가 시작,도착점 입력*/

        a=start1;
        b=start2;

        Findpath(); /*길찾기 함수*/
}



/*시작점 함수*/  

void Point()
{        printf("\n시작점과 끝점을 입력하세요. 1이 길이 있는 곳입니다.(예시:1,1)\n");
        printf("시작점 => ");
        scanf("%d,%d",&start1,&start2);
        
        if(map[start1][start2] == 0){
                printf("시작점으로 입력한 곳은 길이 아닙니다.");
                Point();
        }
        else if(map[start1][start2] ==1)
                Point2();
        else{
                printf("잘못 입력하셨습니다.\n");
                Point();
        }
}
/*도착점 함수*/
void Point2()
{
        printf("도착점 => ");
        scanf("%d,%d",&end1,&end2);

        if(map[end1][end2]==0){
                printf("도착점으로 입력한 곳은 길이 아닙니다.");
                Point2();
        }
        else if(map[end1][end2]==1)
                printf("시작점은 (%d,%d), 도착점은 (%d,%d)입니다.\n\n",start1,start2,end1,end2);
        else{
                printf("잘못 입력하셨습니다.");
                Point2();
        }
}



void Findpath()
{        
        if((a==end1 && b==end2) == 1){
                map[a][b] = 2;
                Finish();}

        else if(map[a][b+1] == 1){
                Moveright();
                Findpath();}
        else if(map[a+1][b] == 1){
                Movedown();
                Findpath();}
        else if(map[a][b-1] == 1){
                Moveleft();
                Findpath();}
        else if(map[a-1][b] == 1){
                Moveup();
                Findpath();}
        
        else if(map[a][b+1] == 2){
                Backright();
                Findpath();}
        else if(map[a+1][b] == 2){
                Backdown();
                Findpath();}
        else if(map[a][b-1] == 2){
                Backleft();
                Findpath();}
        else if(map[a-1][b] == 2){
                Backup();
                Findpath();}
        
        else
                Noway();
}


void Moveright()
{        map[a][b] = 2;
        a=a;
        b=b+1;
        length += 1;
}
void Movedown()
{        map[a][b] = 2;
        a=a+1;
        b=b;
        length += 1;
}
void Moveleft()
{        map[a][b] = 2;
        a=a;
        b=b-1;
        length += 1;
}
void Moveup()
{        map[a][b] = 2;
        a=a-1;
        b=b;
        length += 1;
}


void Backright()
{        map[a][b] = 3;
        a=a;
        b=b+1;
        length -= 1;
}
void Backdown()
{        map[a][b] = 3;
        a=a+1;
        b=b;
        length -= 1;
}
void Backleft()
{        map[a][b] = 3;
        a=a;
        b=b-1;
        length -= 1;
}
void Backup()
{         map[a][b] = 3;
        a=a-1;
        b=b;
        length -= 1;
}

void Finish()
{        int i;
        for(i = 0; i < 16; i++){
                printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",map[i][0],map[i][1],map[i][2],map[i][3],map[i][4],map[i][5],map[i][6],map[i][7],map[i][8],map[i][9],map[i][10],map[i][11],map[i][12],map[i][13],map[i][14],map[i][15]);
        }
        printf("시작점으로부터 도착점까지의 거리는 %d입니다.",(length-1));
}
void Noway()
{
        printf("\n길이 없습니다.");
}
                

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
정지연
05/05/24 17:48
수정 아이콘
스택을 안썼기 때문에 중간에 길이 막히면 거기서 맴돌기 때문입니다.. 막다른길이면 들어온 곳으로 다시 가서 이전에 안 갔던 길을 검색해서 가야하는데 findpath() 함수는 무조건 한쪽 방향으로만 검색해가기 때문에 나왔다가 그 막다른길로 다시 들어갑니다.. 자료구조 책 보고 스택의 원리부터 이해한다음에 스택을 사용해서 프로그램을 짜면 해결됩니다..
비엔나커피
05/05/24 18:04
수정 아이콘
스택을 쓰라고 내준 과젠데 안쓸라 하시니 글쳐 ^^
참고로 갈래길이 있을때 체크를 해두시면 더 빨라집니다.
ForeverFree
05/05/24 19:40
수정 아이콘
역시 PGR에는 똑똑하신 분들이 많아서 네이버 지식검색보다 여기 올리는게 더 빠른거 같네요 ^^;;
컴퓨터 공학이라면 자료구조를 잘 보셔야 합니다. 그래야지만 나중에 배우는 화일처리론이나 알고리즘도 잘 하실수 있습니다.
휘발유
05/05/24 22:15
수정 아이콘
자료구조가 가장 기본이죠 ^^
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
8318 Z:T, Z:P를 어떻게 상대해야 할까요? [2] Sunny1330 05/05/26 1330
8317 김성제선수 동영상BGM 질문좀... Q(˝Q)아웃복서~1579 05/05/26 1579
8316 초등학교 교과서에 관한 질문 케이1584 05/05/26 1584
8314 게임하다가 이상하게 튕겨버렸습니다. [3] Apocalypse1662 05/05/26 1662
8312 이거 무좀인가요? [4] 별 이 만 을1539 05/05/26 1539
8311 bug]입구가 막혔는데 탱크가 그냥 나가네요..ㅡㅡ [4] 로미..2122 05/05/25 2122
8310 박태민선수를 왜 팀민이라고 부르는거죠??? [2] Endless Rain1935 05/05/25 1935
8309 중고오토바이를 샀는데 -_-;; [2] 1827 05/05/25 1827
8307 영어문제의 애매함 ㅡㅡ [11] 결함1470 05/05/25 1470
8306 해몽좀 부탁 드립니다.. [7] 매너게이머1521 05/05/25 1521
8305 이 영화 제목이 뭔지 아시는분? [5] 趙子龍1545 05/05/25 1545
8304 옛날msl vod는 볼수없나요? [1] ManuS1615 05/05/25 1615
8303 이건 질문인데요... [12] 시작하는테란1757 05/05/25 1757
8302 유머를 영어로 뭐라고 하는지요?? [6] DynamicToss3216 05/05/25 3216
8301 팝송 추천좀 부탁드려요^^ [5] ElaN1408 05/05/25 1408
8300 유게 게시글중에 리플많이달린 게시물이 몇번인지아시는분? [5] 러빙유초롱1440 05/05/25 1440
8299 TvsP)레퀴엠 도대체 어떻게 해야하나요..ㅠㅠ(플토상대) [13] 로미..1574 05/05/25 1574
8298 물리는 좋은데 물리학과는 싫어요 [13] 결함1267 05/05/24 1267
8297 그리스 신에 대해서 해박하신분만 [3] Butterfly1665 05/05/24 1665
8296 플토가 유닛 277마리에 프로브가 46퍼센트면 적당한가요?? [8] Entity2105 05/05/24 2105
8295 스타를 거의 일년 넘게 안하다보니... [5] 랜드워커1659 05/05/24 1659
8294 신대나무라고 해야 할까요? 테란 전략에 관한 질문입니다. [4] 강신구1588 05/05/24 1588
8292 할 일 없으신분들;; 간단한 c 프로그래밍 [4] Turbo1459 05/05/24 1459
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로