디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇㅇ(1.209) 2013.01.22 11:05:53
조회 152 추천 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);
        }

        [...];

        /*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/28 - -
AD 휴대폰 액세서리 세일 중임! 운영자 25/07/28 - -
346432 쪽팔리면 더 공부하기 [1] 일광면(121.177) 13.02.19 101 0
346431 iptime 방문 열고 안열고 속도차이 현저히 나.. [3] 일광면(121.177) 13.02.19 125 0
346428 정보처리기능사 어렵나요 실기 (상시로) [2] ㅇㅇㄻ(112.161) 13.02.19 160 0
346427 아오 시밤 컴터만 했더니 눈 아프다. [1] 멍청닭(182.211) 13.02.19 79 0
346425 지매크로 관련 질문! 횽들 도와주세요 w(125.128) 13.02.19 59 0
346424 프밍책중에 바이블이하고 붙어있는것들 무슨뜻임? [2] 소크라테스(58.227) 13.02.19 75 0
346422 여기가 숙제갤인가요? [1] McHello갤로그로 이동합니다. 13.02.19 115 0
346420 프갤 게이들아 그래픽 라이브러리 질문 좀 할게 [9] 핥라산갤로그로 이동합니다. 13.02.19 121 0
346419 여기가 컴갤인가요? [2] ㅋㄱ(183.96) 13.02.19 73 0
346417 try catch를 좁게 감싸는게 더 좋은거 아님? [1] 오라오라(175.197) 13.02.19 95 0
346416 형들 대학교 상담점 [6] 소크라테스(58.227) 13.02.19 166 0
346415 게시판 리스트랑 디비안에서 [2] 개구리래머갤로그로 이동합니다. 13.02.19 64 0
346414 안드로이드 잘하는 형 있어? 어플 말고 시스템 [3] 박느낌갤로그로 이동합니다. 13.02.19 97 0
346412 붕어싸만코 광고 재밌다 이모군(175.114) 13.02.19 59 0
346411 오라클 같은거 돈내고 설치해야함? 오라오라(175.197) 13.02.19 42 0
346410 형들 고려대 정보보호대학원에서 김앤장 가는 사람들은 뭐임? [2] ㅁㄴㅇㄹ(124.51) 13.02.19 403 0
346409 [자바] 트리 노드를 삭제하면 자동으로 그 형제 노드가 선택되게 하려는데 [3] Prographer갤로그로 이동합니다. 13.02.19 104 0
346408 리눅스 배우러 IT 뱅크 다닌 소감 [2] adsf(121.66) 13.02.19 249 0
346407 여기 아직 살아있나요? [1] McHello갤로그로 이동합니다. 13.02.19 68 0
346405 [c]내가만든 팩토리얼임 [4] 똥쟁이(114.204) 13.02.19 161 0
346404 님들아 이거 같이 쓰려면 어떻게 해야함 [3] ㅁㄴㅇㅁㄴㅇ(211.189) 13.02.19 82 0
346403 님들아 이게 뭐임 [4] ㅁㄴㅇㅁㄴㅇ(211.189) 13.02.19 79 0
346402 영어 자바 문제 해석좀 해주실분... [2] 자바크리(71.225) 13.02.19 84 0
346400 엄청 유치한 질문인데 페이스북 정도 웹커뮤니티 짤려면.. [13] ㅇㅁㄴ(58.126) 13.02.19 280 0
346399 IT특기병/전공대비/고졸,미취업자 중소기업친화과정취업반국비지원전액지원안내 김민섭팀장(211.48) 13.02.19 58 0
346397 python [6] 군대python(220.94) 13.02.19 185 0
346396 원래 포인터가 알듯하면서 모를꺼같은 느낌드는건가여? ㅁㄴㅇㄹ(76.94) 13.02.19 56 0
346394 설계단에서 계속 빡친다... [1] 1234(121.126) 13.02.19 72 0
346393 c# 하는 횽들 질문이 있어. [17] 힝아(1.212) 13.02.19 162 0
346392 형들 질문 좀 받아줘 [1] ㅋㅌㅊ(218.54) 13.02.19 47 0
346390 프갤 왜 실북갤 2위임 -ㅅ- 님들 조작같은것좀 하지마시죠 [6] lol백과사전(112.220) 13.02.19 182 0
346388 오라클 설치오류 질문. [4] 오라클(222.114) 13.02.19 147 0
346387 private 상속이니 protected 상속이니 하는건 C++ 만? [4] 통맥갤로그로 이동합니다. 13.02.19 108 0
346385 LDAP서버가 검색이 빠른 이유가 뭐야? [1] 133(115.144) 13.02.19 235 0
346384 형드라 졸작 주제좀 정해조 [2] ?(123.142) 13.02.19 195 0
346383 null을 아스키코드로 나타낼려면 ''로 해야되나여? [11] ㅁㄴㅇㄹ(76.94) 13.02.19 123 0
346382 야 님들아 [7] 무술소년고망갤로그로 이동합니다. 13.02.19 137 0
346381 형들 자바 책좀 소개해줘 [5] 15534(108.198) 13.02.19 159 0
346380 야 근데 Dev C++ 써야하냐 vs 써야하냐 vs 존나 편해보이는데 [6] ㅁㄴㅇㅁㄴㅇ(211.189) 13.02.19 152 0
346379 프로그래밍 존나 어려운데 막 만드는 재미는 있네 [2] ㅁㄴㅇㅁㄴㅇ(211.189) 13.02.19 137 0
346378 야 C 언어 배워서 뭐하냐 그냥 기초임? [4] ㅁㄴㅇㅁㄴㅇ(211.189) 13.02.19 194 0
346377 윈도우7 쓰고있는데 윈도우 xp에서 하는 카드놀이 어떻게함? [2] ㄴ아ㅓㄹ(121.152) 13.02.19 148 0
346376 컴공쪽도 취업할라면 기자단 이딴거 해야되냐 [2] ㅍㅇ(125.176) 13.02.19 111 0
346374 malloc/free 동적메모리할당을 배열에 어떻게 적용 시키죠? [1] ㅁㅇㄹㄴㄴㅇ(114.200) 13.02.19 97 0
346372 메일함 같은데서 검색으로 압축프로그램내용도 확인하는법 -_-(125.128) 13.02.19 40 0
346371 안드로이드 DB 쓸때 ArrayList 로 다 긁어오는게 좋음? [5] qwrqwr(194.214) 13.02.19 119 0
346370 횽들 이 사이트. 제로보드만으로 만들 수 있지? [3] 멍멍(218.232) 13.02.19 146 0
346369 C++ 동적 메모리 할당에 관해 질문 하나만 할게~^^ [5] 횽들(115.136) 13.02.19 126 0
346368 형들 언어공부하면서 궁금한건데 [1] ㅓㅏㅓㅏㅓㅏㅓ갤로그로 이동합니다. 13.02.19 81 0
346367 와 진짜 미치겠다 포폴만드려는데 [6] 도레기(221.138) 13.02.19 199 0
뉴스 '은수 좋은 날' 김영광, "이젤 너머의 두 얼굴... 선과 악 사이에서 흔들리다" 첫 티저 포스터 공개! 디시트렌드 07.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2