디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

미로찾는 생쥐인데... 왜 에러나냐?

ㅇㅇㅇ(1.209) 2013.01.22 11:05:53
조회 146 추천 0 댓글 7


문제는 디버깅하며 한라인 한라인 실행하면 문제가 없는데...

그냥 런하면 첫번째 돌고 에러난다... 왜그런건지 아는 프갤러 있음?

아래는 소스






/*
 * 파일명 : Robot.c
 * 작성일 : 2013.01.21.MON.
 * 작성자 : M
 * 내  용 : 미로 찾는 생쥐
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define MAZE_SIZE        19
#define ROBOT                15

#define UP                1
#define RIGHT        2
#define DOWN        4
#define LEFT        8

// 얼굴 모양의 ASCII CODE
int maze[MAZE_SIZE][MAZE_SIZE]=
{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
 {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
 {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
 {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1},
 {1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1},
 {1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
 {1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
 {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};

int sx=MAZE_SIZE-1, sy=MAZE_SIZE-2;        // 생쥐의 출발 위치

int * rec;        // 최단 경로 계산을 위해 생쥐가 움직인 경로를 저장

void gotoxy(int x,int y)
        COORD pos={x,y};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); 
}

int get_shape(int m[][MAZE_SIZE], int x, int y)
{
        static shape[]=
        {32, 5, 6, 3, 5, 5, 1, 25, 6, 4, 6,
         21, 2, 23, 22, 16};
        //{32, 179, 196, 192, 179, 179, 218, 195, 196, 217, 196,
        // 193, 191, 180, 194, 197};
        // 5=|,

        int s=0;

        if(m[y][x])
        {
                if(y>0 && m[y-1][x])
                        s |= UP;        // y>0이 윗쪽 경계를 넘지않나 확인
                if(y<MAZE_SIZE-2 && m[y+1][x])
                        s |= DOWN;        // y<MAZE_SIZE-2 가 아랫쪽 경계를 넘지 않나 확인
                if(x>0 && m[y][x-1])
                        s |= LEFT;        // x>0이 왼쪽 경계를 넘지 않나 확인
                if(x<MAZE_SIZE-2 && m[y][x+1])
                        s |= RIGHT;        // x<MAZE_SIZE-2가 오른쪽 경계를 넘지 않나 확인
        }

        return shape[s];
}

// 미로를 화면에 그려줌
void draw_maze(int m[][MAZE_SIZE])
{
        int i, j;

        for(j=0; j<MAZE_SIZE; j++)
        {
                for(i=0; i<MAZE_SIZE; i++)
                {
                        gotoxy(i+1, j+1);        // gotoxy()는 화면 좌측상단이(0,0)이 아니라 (1,1)이기 때문에 1을 더함
                        putch(get_shape(m, i, j));
                }
        }
}

// 생쥐의 이동 경로를 저장
void record(int x, int y)
{
        static int index=0;        // 내부 정적 변수
        rec[index++]=x;
        rec[index++]=y;
}

// 생쥐를 한칸 앞으로 이동
void forward(int *x, int *y, int dir)
{
        gotoxy(*x+1, *y+1);        // 생쥐를 지운다.
        putch(' ');

        *x=(dir==LEFT) ? --(*x) : 
                (dir==RIGHT) ? ++(*x) : *x;
        *y=(dir==UP) ? --(*y) :
                (dir==DOWN) ? ++(*y) : *y;

        record(*x, *y);        // 최단 경로를 찾기 위해 경로를 저장
        gotoxy(*x+1, *y+1);        // 생쥐를 그린다.
        putch(ROBOT);
}

// 생쥐의 방향을 시계 방향으로
void right(int *dir)
{
        *dir<<=1;
        *dir=(*dir>LEFT) ? UP : *dir;        // LEFT를 시계 방향으로 튼 경우
}

// 생쥐의 방향을 반시계 방향으로
void left(int *dir)
{
        *dir>>=1;
        *dir=(*dir==0) ? LEFT : *dir;        // UP을 반시계 방향으로 튼 경우
}

// 아직 미로에 들어 있는가?
int still_in_maze(int x, int y)
{
        if(x>0 && x<MAZE_SIZE-1 && y>0 && y<MAZE_SIZE-1)
                return 1;
        else
                return 0;
}

// 벽이 앞에 있는가?
int wall_ahead(int m[][MAZE_SIZE], int x, int y, int dir)
{
        x=(dir==LEFT) ? --x : (dir==RIGHT) ? ++x : x;
        y=(dir==UP) ? --y : (dir==DOWN) ? ++y : y;

        return m[y][x];
}

// 우선법 알고리즘
void right_hand(int m[][MAZE_SIZE], int x, int y, int dir)
{
        gotoxy(x+1, y+1);        // 처음 생쥐의 모습을 그려줌
        putch(ROBOT);
        record(x, y);        // 최단 경로를 찾기 위해 처음의 좌표를 저장

        forward(&x, &y, dir);        // 앞으로 간다

        while(still_in_maze(x, y))        // 아직 미로 안이면
        {
                Sleep(100);        // 이동 속도가 너무 빠르므로 지연 시간을 넣음
                right(&dir);        // 시계 방향으로 튼다

                while(wall_ahead(m, x, y, dir))        // 앞에 벽이 있으면
                        left(&dir);        // 왼쪽으로 튼다
                forward(&x, &y, dir);        // 앞으로 간다.
        }
        record(-1, -1);        // 경로의 끝을 나타냄
}

// 중복된 경로의 삭제
int del_path(int i, int j)
{
        int k=i;

        while(rec[j]>=0)        // 삭제
                rec[i++]=rec[j++];
        rec[i]=-1;

        return k;        // k는 삭제되고 난 뒤의 j가 가져야 할 값
}

// 중복된 경로 제거 알고리즘
void shortest_path(void)
{
        int i=0;
        int x, y;
        int j;
        int x1, y1;

        while(rec[i]>=0)        // 최단경로 찾기
        {
                x=rec[i];
                y=rec[i+1];
                j=i+2;        // 2를 더한 이유? 한 좌표가 두 정수이므로 다음 좌표는 +2이다.
                
                while(rec[j]>=0)
                {
                        x1=rec[j];
                        y1=rec[j+1];
                        if(x==x1 && y==y1)        // 같은 좌표가 발견되면
                                j=del_path(i, j);        // 중복되는 경로 삭제
                        j++;
                        j++;
                }
                i++;
                i++;
        }
        
        i=0;        // 최단 경로를 움직이는 생쥐 애니메이션

        while(rec[i]>=0)
        {
                x=rec[i++];
                y=rec[i++];
                
                gotoxy(x+1, y+1);
                putch(ROBOT);        // 생쥐를 그림
                Sleep(100);                // 지연 시간
                gotoxy(x+1, y+1);
                putch(' ');        // 생쥐를 지움
        }
}

int main(void)
{
        int i;

        rec=(int*)malloc(MAZE_SIZE*MAZE_SIZE);        // 생쥐의 움직임 저장
        
        if(rec==NULL)        // 메모리 할당 에러
        {
                printf("\n Memory allocation error! \n");
                exit(1);
        }

        system("cls");

        /*for(i=0; i<200; i++)
        {
                putch(i);
                printf(" %d\n", i);
        }*/

        draw_maze(maze);

        gotoxy(40, 5);
        printf("Simulation of Mrio Mouse");
        gotoxy(40, 10);

        printf("Press any key to start");
        getchar();
        //bioskey(0);
        right_hand(maze, sx, sy, LEFT);        // 생쥐 1차 시도

        /* 위에 right_hand 실행하면 에러남... 왜그럼?
         * 한줄씩 디버깅하면 괜찮은데... 그냥 런하면 에러남..
         *
         */

        gotoxy(40, 10);
        printf("Press any key to see shortest path...");
        //bioskey(0);
        getchar();
        shortest_path();        // 생쥐 2차 시도, 최단 경로

        gotoxy(40, 10);
        printf("Press any key to end program...        ");
        //bioskey(0);
        getchar();

        return 0;
}

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
343607 야 파싱해서 속성값가져오다가보니 7중 for문이 되었는데 [14] 얼룩돼지갤로그로 이동합니다. 13.01.21 196 0
343604 만약 여자하고 남자 한명이 있는데 한 명만 남아야 집으로 돌아갈 수 잇음 [6] A.I.(175.200) 13.01.21 170 0
343603 윤성우의 c파워 업그레이드 책 보며 문제풀고 있는데 [5] ㅈㄴ(183.106) 13.01.21 186 0
343600 [자바교육] 전액무료 자바교육 웹프로그래밍 앱개발 신입개발 양성교육 중앙일보HTA갤로그로 이동합니다. 13.01.21 87 0
343596 람다는 람다람다해~ [2] ㅋㄱ(183.96) 13.01.21 127 0
343595 오바마 대통령, 게임-총기 폭력 관련성 연구에 1천만달러 예산 지원 [2] ㅇ3ㅇ(180.66) 13.01.21 100 0
343594 근데 SI 공사판은 우리 나라 종특이냐? [2] ㅇㅇ(58.102) 13.01.21 149 0
343592 SI업체가 용역인가여??; [3] sco(58.127) 13.01.21 196 0
343590 C언어밖에 모르는 상태에서 취직했는데 [7] ㅁㄴㅇ(125.143) 13.01.21 391 1
343589 몇개월정도 공부해야지 스스로 php로 게시판 만들수있음? [4] php신(175.215) 13.01.21 178 0
343588 프로그래밍좀 한다싶을정도가 되려면 어느정도 클라스가 되야함 ? [3] ㅇㅇ(123.212) 13.01.21 258 1
343587 형들은 몇백만원짜리 프로그램 깔았어 ? ㅇㅇ(123.212) 13.01.21 104 0
343586 디자인 패턴책 보는데 돌아버리겟네 [12] 자바초보(211.183) 13.01.21 220 0
343585 템프스탭이라는 인재파견 어때??? 구래구래(211.215) 13.01.21 39 0
343584 C 매크로 사용시 주의할점 [2] classical(110.70) 13.01.21 170 1
343582 안드로이드 사이드 뭐냐 [2] ㅇㅇ(211.215) 13.01.21 105 0
343581 일베에서 사랑돋긔인가 뭔가 보고 네이버에서 찾아봤다. [7] ㅇㅇ(58.102) 13.01.21 245 0
343579 SAP 하시는 성님 있나여? [1] 123(112.153) 13.01.21 110 0
343578 면접보구 왔다 진통제(112.171) 13.01.21 92 0
343577 php는 어떠케 공부하는겁니까? +ajax는 머라고발음해야함니까 [7] php신(175.215) 13.01.21 149 0
343576 온라인모바일게임공부할려고 nodejs쓸려고하는대 괜찮? (211.237) 13.01.21 44 0
343575 시스템엔지니어가 꿈인데,, 리눅스를 어느정도까지 공부해야됨?? [3] 토트넘이체고시다!갤로그로 이동합니다. 13.01.21 442 1
343574 개발자까지는아니고, 개발자 하려는 학생인데 울트라북써도됨? [3] ㅇㅇ(112.153) 13.01.21 200 0
343573 게시판 강좌 따라보면서 만들고있는데 [3] wws(175.215) 13.01.21 74 0
343572 자바스크립이나 에이작스 좀 만져본 놈들은 [1] ㅁㄴㅇ(119.202) 13.01.21 137 0
343571 php게시판만드는거 뭐이리힘듬?? 장제스(175.215) 13.01.21 62 0
343570 소멤 전화온사람없나.. [3] 구피(210.179) 13.01.21 145 1
343569 형들 자바학원추천점 [6] 뉴비(112.216) 13.01.21 161 0
343568 입학 전에 윤성우 열강 C 독학하는데 손코딩으로 해도 상관없겠죠 [10] 플로피디스크갤로그로 이동합니다. 13.01.21 258 1
343567 자바 잘하는 프갤러들있나..? 나 초보인데 상수는 메모리에 저장돼..? [2] ㅇㅇ(211.224) 13.01.21 122 0
343566 자바 볍신같다. 비오는데 먼지나게 패고 싶다 [2] 볍신자바(223.32) 13.01.21 129 1
343565 '#define 함수명' 이랑 'void 함수명()' 뭔 차이?? [22] 나초보(182.172) 13.01.21 248 0
343564 SQLite3에서 시퀀스를 생성하는 autoincrement의 문제점. ㅁㄴㅇ(119.202) 13.01.21 84 0
343563 HTML의 메타 태그 <meta>에 대한 고찰 ㅁㄴㅇ(119.202) 13.01.21 105 1
343562 프로그래밍은 수학점수랑 관련없다 수학적사고력에 관계잇지 [16] asdfw(175.215) 13.01.21 316 1
343561 한국에서 프로그래머의 위치는 어느 정도일까? [4] 멍청닭(182.211) 13.01.21 301 1
343558 입사 두달째‥‥ 몸이 적응이 안된다 [5] 노흑(211.36) 13.01.21 279 0
343557 디씨 홈페이지 키워드 meta태그 오타.ㅓㅔㅎ [2] 1.602*10^-19갤로그로 이동합니다. 13.01.21 150 0
343554 HTML 기본적인 태그인데 그 유투브 embed 로 긁어올때 풀스크린 [5] dd(124.197) 13.01.21 111 0
343553 sprintf 에서 에러가 나는데 왜 나는지 잘 모르겠음 [8] 늘모(58.143) 13.01.21 134 0
343549 해킹 : 공격의 예술 이란 책을빌려서 읽는데 생각보다어렵구나.. 염산.갤로그로 이동합니다. 13.01.21 321 1
343548 파로스로 좀 깔짝거리면 디시나 일베에 태그난사할수있지않음? [2] asww(175.215) 13.01.21 118 1
343547 C언어 가상메모리구조에 관해 질문 [19] dasf(36.39) 13.01.21 304 0
343545 2d게임 경사로 구현중인데 질문점 [3] g.w.갤로그로 이동합니다. 13.01.21 183 0
343544 세상 뒤집은 1인 개발자의 필살기는? [7] 에어로홍갤로그로 이동합니다. 13.01.21 364 0
343543 갤러님들아 웹해킹/보안 관련 서적 추천점여 [3] assd(175.215) 13.01.20 160 2
343542 횽들 용책 해골책에 본(bone) 심어서 캐릭 움직이는건 안알려주지? [2] 김삼디(110.9) 13.01.20 118 0
343541 C언어 초보인데 이런 포인터는 기본이야...ㅇㅇ? [5] 초보(211.224) 13.01.20 218 1
343540 여기서 말입니다. [2] ㅌㄹㅇ갤로그로 이동합니다. 13.01.20 65 1
343538 웹개발쪽 회사는 회사 자체가 IT계열밖에 없음? [5] (116.120) 13.01.20 213 0
뉴스 [탐정들의 영업비밀] 명문대 입학 후 소식 끊긴 딸, 알고 보니 임신! "책임지겠다" 무릎 꿇은 아이 아빠 정체는? 디시트렌드 06.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2