디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅇ(1.209) 2013.01.22 11:05:53
조회 149 추천 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/14 - -
AD 디지털 액세서리 기간한정 세일! 운영자 25/07/11 - -
344602 프로그래머는 왜 프로그래머냐 [5] (168.126) 13.02.02 218 0
344601 음원 신보 두 곡입니다 에어로홍갤로그로 이동합니다. 13.02.02 50 0
344600 야 나막장인데 인생조언좀 [14] ■x(175.202) 13.02.02 260 1
344599 방금 존내 이상한 실험을 했음 [5] 헤헤(221.160) 13.02.02 247 0
344596 자바도 릴리즈 빌드 잇나여? [1] 헤헤(221.160) 13.02.01 74 0
344595 미국 프로그래머에 대한 질문? [7] 와우컹컹갤로그로 이동합니다. 13.02.01 521 0
344594 형들 C#으로 녹음 & 재생기 짜는 데 조언좀 [2] 납땜왕(14.32) 13.02.01 195 0
344593 시스템 종료하지말라는거 생까고 종료했더니 CPU가 맛탱이간듯ㅋㅋ [16] a(114.199) 13.02.01 252 1
344590 우리중에 스파이가 있어 [5] 루비•‿•갤로그로 이동합니다. 13.02.01 194 1
344588 와 씨발 진짜 한번꼬이니까 개 좆같다 [7] 08학번공대생갤로그로 이동합니다. 13.02.01 240 0
344587 정보처리기사만 왜 비관련학과 응시자격 주어지냐? [6] 123(1.241) 13.02.01 563 0
344585 책이 ios5 용인데 ios6책을 다시 사야할까??? [3] 멍청닭(182.211) 13.02.01 128 0
344584 콜 바이 레퍼런스가 더 좋지 않냐?? [3] emacs(58.145) 13.02.01 146 0
344583 컴공돌이 새내기인데 IT뱅크에서 상담 받으라고 연락이 왔는데열ㅡㅡ; [7] 플로피디스크갤로그로 이동합니다. 13.02.01 354 1
344582 한국it전문대 나온형 있어? [3] Memi갤로그로 이동합니다. 13.02.01 169 0
344581 에어로횽님 무슨 자꾸 밥 한끼입니까 ㅋㅋㅋ 4만원 투자하셔요. [4] 상상(175.123) 13.02.01 105 1
344580 mmorpg나 온라인게임만들어본님들 DB 사용할때 질문점받아주세여 [13] (168.126) 13.02.01 196 0
344578 해커님들께 질문 [1] 에어로홍갤로그로 이동합니다. 13.02.01 151 0
344577 횽아들 crc bypass 구하는방법좀 [1] 부산맴(39.113) 13.02.01 75 0
344574 오유가 그렇게 해킹에 취약하나요? [2] 콩검(121.124) 13.02.01 152 0
344573 컴공졸업하고 [1] Komputer(58.125) 13.02.01 257 0
344572 입사문제: 서울사는 20대 미녀가 남자친구 있을 확률 [6] 에어로홍갤로그로 이동합니다. 13.02.01 263 0
344571 그만 두기로 결정했음. [5] ☎2.52™갤로그로 이동합니다. 13.02.01 193 0
344570 복습 필요없음. 새로고침 하루에 한번정도면 족함... ㅋㄱ(183.96) 13.02.01 107 0
344569 다른 두 공유기 (NAT) 아래에 있는 단말기간 p2p 통신.. [16] 큐티커갤로그로 이동합니다. 13.02.01 145 0
344568 프갤 살다가 컴본갤가니깐 정신이 없다 [3] 천국거지갤로그로 이동합니다. 13.02.01 104 0
344567 솔직히 한국 교육정책때문에 프로그래머가 힘들긴하다. 특히 상위 10~30 [3] 만년코더(211.112) 13.02.01 161 0
344566 포팅 외전 [1] ㅇㅇ(58.102) 13.02.01 53 0
344565 그날 그날이 너무나 따분해서~모든 게 재미없는 일뿐이야~ [9] 상상(175.123) 13.02.01 104 1
344564 Win32api 자식윈도우 메시지 처리하기 설명좀 부탁드려요 [7] 이힝(175.215) 13.02.01 126 0
344563 자라 이후로 글이 없다는건 내가 오늘 첫글인가?? [1] 멍청닭(182.211) 13.02.01 51 1
344562 Node.js 전망있나요? [1] zzz(180.67) 13.02.01 156 0
344561 redmine 일감 유형에 말야 [4] ㅁㄴㄻㄹ갤로그로 이동합니다. 13.02.01 93 0
344560 SI 웹쪽으로 다니는사람중에 ㅇㄹ(118.36) 13.02.01 211 0
344559 허나 거절한다. [4] ?(123.142) 13.02.01 126 0
344558 8 - Win.임베디드를 다운받는 중. [2] 때릴꺼야?(116.40) 13.02.01 151 0
344557 잠시 있었다 싶으면 나오는 [1] 호갱(117.110) 13.02.01 54 0
344556 웨펀마스터는 봅니다 에어로홍갤로그로 이동합니다. 13.02.01 60 1
344553 흉아들 POST같은거 보내는 내용을 어떻게 알수있을까요 [1] 오소리(27.110) 13.02.01 102 0
344551 웹은 잡일이 많다. 하하하(203.226) 13.02.01 92 0
344550 형들 엑셀 질문좀 있는데 누가 알려줘 제발.... 이런미친갤로그로 이동합니다. 13.02.01 40 0
344549 스터디그룹할 사람모여라~ 아프리카tv로 와라~ [6] ㅇ3ㅇ(180.66) 13.02.01 156 0
344548 세계여러 법칙을 발견한 유명인들중 남자가 많은이유.txt [2] wee(1.214) 13.02.01 237 2
344546 프갤형들에 비하면 이건 완전 쓰1레기지만 [2] ㅁㄴㅇㄹ(183.106) 13.02.01 98 0
344545 좋은 정보 텃밭 얻는 법 [2] 에어로홍갤로그로 이동합니다. 13.02.01 102 0
344544 형들아 지금플래시똥망? ㅇㅁㅁ(124.55) 13.02.01 59 0
344543 앤드뤄이드 Intent 참조변수 선언하는거 어찌해요? [2] 질문좀여(222.116) 13.02.01 70 0
344542 아침이다 잠 깨는 노래 에어로홍갤로그로 이동합니다. 13.02.01 34 0
344541 잠오는 노래 그럴 겁니다 잊을 겁니다 에어로홍갤로그로 이동합니다. 13.02.01 29 0
344540 게임은 자력으로 만들수 없다는걸 깨달았습니다 [7] 웨펀마스터11갤로그로 이동합니다. 13.02.01 340 1
뉴스 美명문대 자퇴하고 이태원서 DJ한다는 김용만 아들 디시트렌드 07.13
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2