디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅇ(1.209) 2013.01.22 11:05:53
조회 151 추천 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/07/21 - -
AD 곧 휴가!! 홈캉스, 바캉스 SALE 운영자 25/07/21 - -
344060 확밀아 하는 공돌이 있냐 [2] 뉴비(1.245) 13.01.25 84 0
344059 졸작 [4] ㅇㅇ(210.94) 13.01.25 121 0
344058 국비학원에서 취업연계해주면 영어필요없나요? [3] ㅇㅇㅇㅇ(221.159) 13.01.25 172 0
344057 26살 고졸 프로그래머 도전할 수 있을까 [16] 자살킹(211.36) 13.01.25 472 0
344056 파이썬 range(0,5) 이런거 출력이 안되요. [1] MapleFlag갤로그로 이동합니다. 13.01.25 97 0
344055 음성지원솔루션을 클릭시 스크립트가 실행되도록 방법좀 알려주세요 ㅇㅇㅇㅇㅇ(210.98) 13.01.25 29 0
344053 자바스크립트로 동영상 없이 Timed Text(smi)만 불러오는거 없냐 따끈한도시락갤로그로 이동합니다. 13.01.25 35 0
344052 님들 해쉬테이블이 자료구조 짱짱맨인가요? [9] d(168.126) 13.01.25 168 0
344048 그런대말야 프갤이 이따금씩 기초 뻘글 올라오잖아 [2] AOB(106.240) 13.01.25 105 0
344047 C언어 구구단 출력이 안되연ㅠㅠ [14] 멘탈붕괴_갤로그로 이동합니다. 13.01.25 206 0
344046 자바가 왜 c로 제작된 프로그램보다 느린거임? [10] 상상(175.123) 13.01.25 243 0
344044 자바로 머하고있는데.. 내가 자바 GUI를 안해봐서... [12] LazyDok갤로그로 이동합니다. 13.01.25 162 0
344043 형들 여기 좀 자주 페이지를 표시할수 없다는대 왜그래요? [1] 소년사나이갤로그로 이동합니다. 13.01.25 32 0
344042 형들 우체국에 서류봉투팔아? [1] WannaParty갤로그로 이동합니다. 13.01.25 104 1
344040 형들 udk 질문좀 ㅁㅇㄴ(220.70) 13.01.25 43 0
344039 레알 병신갑인듯 라비앙로즈(125.133) 13.01.25 55 0
344038 리버싱 핵심원리 책 괜찮네...... [2] ㅇㅇ(203.253) 13.01.25 197 0
344037 이거 해결좀여 ㅠㅠ [3] 시꼬꼬(116.32) 13.01.25 68 0
344036 웹보안관련서적좀요 작성자(203.226) 13.01.25 44 0
344035 따블 따따블 떠블 포인터 질문이요 ㅜㅜ [1] 도티빽(202.30) 13.01.25 64 0
344034 2-3트리 삽입알고리즘ㅈ 명쾌히 설명해주실분 [6] 성균유생 (210.223) 13.01.25 78 0
344030 님들~ 이것좀 해결해주시면 감사하겟습니다 [7] 프로그래밍(211.229) 13.01.25 95 0
344029 클래스 관계에 대해서 질문 [2] r(168.126) 13.01.25 83 0
344027 컴싸는 괴로워 [4] 땡칠도사갤로그로 이동합니다. 13.01.25 235 0
344026 올만에 다시 컴구조 및 설계 명령어 부분 질문! ㅎㅎ [11] 상상(175.123) 13.01.25 184 0
344025 아 c언어 너무 재밌다 !!! [1] 도티빽(202.30) 13.01.25 142 0
344023 이거슨 출력?? [6] 느잇(202.30) 13.01.25 87 0
344022 프로그래머로써 하소연하는건.. 흠.. [2] ㅇㅇ(58.102) 13.01.25 163 0
344021 연봉에 대한 단상... [14] 물속의다이아갤로그로 이동합니다. 13.01.25 398 0
344018 웹개발자 주말 [3] ㅇㅇ?(223.62) 13.01.25 199 0
344017 플래시? 리눅스판 업데이트 다시 재개하면 생각해본다. [2] ㅁㄴㅇ(59.25) 13.01.25 84 0
344016 이글을 보니 프갤러가 생각나는구나. ㅇㅇㅇ(1.209) 13.01.25 47 0
344015 죽었다가 부활한 할머니(기사 링크 첨부) [1] ㅇㅇ(203.90) 13.01.25 69 0
344012 예비소집 가자 [8] isengard(121.168) 13.01.25 135 0
344011 매미 새끼들 맴맴 안거리니깐 살만하네 매미는한철(211.172) 13.01.25 90 0
344008 신촌 sbs아카데미 다녀보신분있나요? [2] ㅇㅇㅋ(211.36) 13.01.25 151 0
344007 비교해서 될일은 아니지만 미쿡에서 제일 바람 많이피는 직종이 프로그래머란 [2] ㅇㅇ(58.102) 13.01.25 156 0
344006 자바 안드로이드어플개발이랑 jsp웹프로그래밍이랑 둘중에 어떤게더 조까틈? [4] 토트넘이체고시다!갤로그로 이동합니다. 13.01.25 202 0
344004 프게이들아 아침이다 [1] 땡칠도사갤로그로 이동합니다. 13.01.25 50 0
344002 어셈블리 초보적인 질문같은데...알려주실분 .ㅠ [2] 우하허갤로그로 이동합니다. 13.01.25 86 0
344001 실력자가 모여있다는 환상을 가지고 프갤을 방문한 사람들에게 [4] :ㅇ(121.160) 13.01.25 206 0
344000 저..눈팅만하는 사람인데요.. 소맴이뭐예요? [2] ㅇㅇ(183.99) 13.01.25 107 0
343999 새벽반 없냐 새벽반 땡칠도사갤로그로 이동합니다. 13.01.25 60 0
343998 앞날이 고민이라서 질문 좀.. [10] 복학생(61.4) 13.01.25 249 1
343997 지잡대는 소멤 지원불가인가요? [2] a(217.147) 13.01.25 302 0
343996 아나.... 아까부터 비츄얼 스튜디오로 기초부터 하고있는데 문제가있음.. [9] 소년사나이갤로그로 이동합니다. 13.01.25 168 1
343993 요즘 같잖은 트위터랑 찌라시때문에 다들 html5=플래시라고 알고 있더라 [4] :ㅇ(121.160) 13.01.25 133 0
343990 초등학꾜 5학년인데 해커가 되고시퍼요 [12] 초딩5(125.180) 13.01.24 230 0
343989 프갤 망했어.... [1] ㅋㄱ(183.96) 13.01.24 149 1
343986 프로그래밍을 배우고 시퍼요 [4] 피죤투(121.140) 13.01.24 153 0
뉴스 ‘삐끼삐끼’ 이주은♥박수종 저격?…박기량 “치어리더-운동선수 연애 금지, 암묵적 룰” 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2