디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅇ(1.209) 2013.01.22 11:05:53
조회 148 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45080 65
2869028 아이돌학교에 대해 잘못 알려져 있는 것들 ㅇㅇ(110.70) 09:04 9 0
2869026 테일윈드안좋은거아니냐 ㅇㅇ 프갤러(211.234) 08:44 7 0
2869024 ❤✨☀⭐나님 시작합니당⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 08:42 4 0
2869022 여름철 내몸냄새확인법 ㅇㅇㅇㅇ(115.144) 08:13 14 0
2869020 참새! 멍멍! ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:03 12 0
2869019 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:01 12 0
2869018 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:00 9 0
2869017 임베디드에 공용 라이브러리 동적링크 한다는 병신도 다 있네 프갤러(27.163) 07:59 22 0
2869015 마스터플랜의 망령 ㅇㅇ(121.169) 07:26 10 0
2869013 낵도리아 저사람 ㅇㅇ(118.235) 07:21 16 0
2869012 이거 안되면 내가 납품 포기해야겠다 ㅆㅇㅆ(124.216) 07:20 19 0
2869010 크래프톤 정글 게임테크 ㅁㅌㅊ? [2] 미니애폴리스갤로그로 이동합니다. 06:42 35 0
2869008 왜 자바/웹만하고 취업어렵다는걸까 [2] ㅇㅇ(223.38) 05:36 48 0
2869006 러스트: '성능'과 '안전' 뒤에 숨겨진 '바이너리 크기'의 현실적 과제 루비갤로그로 이동합니다. 05:10 24 0
2869002 사례 2: BusyBox의 존재 이유와 러스트의 근본적인 한계 [1] 루비갤로그로 이동합니다. 04:25 22 0
2868999 꽃사진에서 반사아이디어 찾은게 신기한건데 프갤러(183.101) 03:36 23 0
2868996 이 옵션 ma 운영체제 operating system건들까요? 넥도리아(121.139) 02:34 26 0
2868994 Taskill 하면 tasklist 이스라엘 이란 전쟁 사망자 늘어납니까 넥도리아(121.139) 02:29 37 0
2868989 러스팅 소울 3장: 균열의 시작 루비갤로그로 이동합니다. 01:44 38 0
2868986 드라이버 쇼트로 자주 부팅해서 파워가 얼마나 버틸까요. 쇼트 나고 탄내 [1] 넥도리아(121.139) 01:28 23 0
2868983 Fg ㅇㅇ(223.38) 00:45 18 0
2868982 Hh ㅇㅇ(223.38) 00:44 35 0
2868981 Hg ㅇㅇ(223.38) 00:44 21 0
2868980 그니까 이거지 이제 프로그래머로써의 가치는 LLM보다 뛰어나야하는데 [1] ㅆㅇㅆ(124.216) 00:24 53 0
2868979 Msinfo System Driver만 완벽히 알면 그 외 넥도리아(121.139) 00:23 27 0
2868977 취업할 때 꿀팁 ㅇㅇ(211.235) 00:18 28 0
2868976 Tuf 장치 암호화 immou 많이도 배운다. msinfo 넥도리아(121.139) 00:18 17 0
2868974 기대치가 크면 너무... 넥도리아(121.139) 00:10 41 0
2868973 내가 죄졌나... 커널 암호화해제만 되었을 뿐인데... 넥도리아(121.139) 00:05 44 0
2868971 요즘 mz들은 왜 회식 싫어함? [8] ㅇㅇ(211.235) 00:04 85 2
2868970 여기 토익 800넘는사람있냐? [1] 프갤러(211.235) 00:02 33 0
2868968 요즘 느끼는게 프로그래밍 실력 늘리는게 아니라, RAG 키우기 해야하는 [1] ㅆㅇㅆ(124.216) 07.01 54 0
2868967 IEChooser 넥도리아(175.196) 07.01 18 0
2868965 요새 프로그래밍 최신 기술 서들 대부분 AI쪽이라서 ㅆㅇㅆ(124.216) 07.01 70 0
2868964 증거가 없으면 진짜 증거불충분으로 풀려나?? [2] ㅇㅇ(223.38) 07.01 40 0
2868963 OS가 운영체제가 저 명령 단축키를 거부합니다. 넥도리아(175.196) 07.01 31 0
2868962 Si 회사에서 서비스로 이직 준비중인데 서탈 30개면 포기하는게 맞지? [3] 프갤러(211.36) 07.01 52 0
2868959 불법 바이럴의 최고 수혜자는 과연 누구? ㅇㅇ(110.70) 07.01 29 0
2868956 알리 이새끼들은 왜 다이소보다 싸게팔수있는거냐 ㅇㅇ [1] 뒷통수한방(1.213) 07.01 43 0
2868954 고3 금융권 IT쪽으로 가고싶은데 시험끝나고 해야할 공부랑 질문 [10] 프갤러(1.245) 07.01 121 0
2868952 대구 다음주 낮기온 39도네 [2] 야옹아저씨갤로그로 이동합니다. 07.01 57 0
2868947 너네 근데 AI 토큰으로 쓰냐 정액제로 쓰냐 [2] ㅆㅇㅆ(124.216) 07.01 53 0
2868945 아 나는 왜 이렇게 천재일까 [4] 아스카영원히사랑해갤로그로 이동합니다. 07.01 60 1
2868943 이거 지울까요 윈도우 파일 디렉토리에서 넥도리아(175.196) 07.01 40 0
2868941 MCP로 바이브 코딩 해보고 이거 못쓰겠다 그냥 [5] ㅆㅇㅆ(124.216) 07.01 76 0
2868939 두고두고 필요한 꿀팁 모음 ㅇㅇㅇㅇ(124.198) 07.01 31 0
2868938 이런 여성스타일 어떻냐? [5] 헬마스터갤로그로 이동합니다. 07.01 83 0
2868936 도서관에 책 빌려보는거 괜찮음? [4] 프갤러(121.179) 07.01 50 0
2868934 인공지능안하고 그냥 개발자 할거면 머신러닝,딥러닝 이런거 안해도 됨? 프갤러(118.131) 07.01 24 0
뉴스 임수빈 모델, 글로벌 컨퍼런스 '넥서스2140' 한국 첫 개최 참석 (미스비트코인모델대회) 디시트렌드 07.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2