#include #include #include #define MAX_STACK_SIZE 100 #define MAZE_SIZE 6 typedef struct { // ±³Ã¼! short r; short c; } element; typedef struct { element data[MAX_STACK_SIZE]; int top; } StackType; // ½ºÅà ÃʱâÈ­ ÇÔ¼ö void init_stack(StackType *s) { s->top = -1; } // °ø¹é »óÅ °ËÃâ ÇÔ¼ö int is_empty(StackType *s) { return (s->top == -1); } // Æ÷È­ »óÅ °ËÃâ ÇÔ¼ö int is_full(StackType *s) { return (s->top == (MAX_STACK_SIZE - 1)); } // »ðÀÔÇÔ¼ö void push(StackType *s, element item) { if (is_full(s)) { fprintf(stderr, "½ºÅà Æ÷È­ ¿¡·¯\n"); return; } else s->data[++(s->top)] = item; } // »èÁ¦ÇÔ¼ö element pop(StackType *s) { if (is_empty(s)) { fprintf(stderr, "½ºÅà °ø¹é ¿¡·¯\n"); exit(1); } else return s->data[(s->top)--]; } // ÇÇÅ©ÇÔ¼ö element peek(StackType *s) { if (is_empty(s)) { fprintf(stderr, "½ºÅà °ø¹é ¿¡·¯\n"); exit(1); } else return s->data[s->top]; } // ===== ½ºÅà ÄÚµåÀÇ ³¡ ===== element here = { 1,0 }, entry = { 1,0 }; char maze[MAZE_SIZE][MAZE_SIZE] = { { '1', '1', '1', '1', '1', '1' }, { 'e', '0', '1', '0', '0', '1' }, { '1', '0', '0', '0', '1', '1' }, { '1', '0', '1', '1', '1', '1' }, { '1', '0', '0', '0', '0', 'x' }, { '1', '1', '1', '1', '1', '1' }, }; // À§Ä¡¸¦ ½ºÅÿ¡ »ðÀÔ void push_loc(StackType *s, int r, int c) { if (r < 0 || c < 0) return; if (maze[r][c] != '1' && maze[r][c] != '.') { element tmp; tmp.r = r; tmp.c = c; push(s, tmp); } } // ¹Ì·Î¸¦ È­¸é¿¡ Ãâ·ÂÇÑ´Ù. void maze_print(char maze[MAZE_SIZE][MAZE_SIZE]) { printf("\n"); for (int r = 0; r < MAZE_SIZE; r++) { for (int c = 0; c < MAZE_SIZE; c++) { printf("%c", maze[r][c]); } printf("\n"); } } int path_length = 0; void backtracking_load(StackType *s, int r, int c, StackType *sm) { element next, tmp; if ((maze[r - 1][c] == '1' || maze[r - 1][c] == '.') && (maze[r + 1][c] == '1' || maze[r + 1][c] == '.') && (maze[r][c - 1] == '1' || maze[r][c - 1] == '.') && (maze[r][c + 1] == '1' || maze[r][c + 1] == '.')) { // ¸·´Ù¸¥ °÷ next = peek(s); do { tmp = pop(sm); path_length--; if ((abs(tmp.c - next.c) + abs(tmp.r - next.r)) == 1) {// backtracking À§Ä¡ ãÀ½ push(sm, tmp); break; } } while (1); } } void print_path(StackType *sm) { int i; element tmp; printf("Ãⱸ->"); for (i = 0; i < path_length; i++) { tmp = pop(sm); printf("(%d,%d)", tmp.r, tmp.c); } printf("->ÀÔ±¸\n"); } int main(void) { int r, c; StackType s, sm; init_stack(&s); init_stack(&sm); here = entry; while (maze[here.r][here.c] != 'x') { r = here.r; c = here.c; maze[r][c] = '.'; maze_print(maze); push_loc(&s, r - 1, c); push_loc(&s, r + 1, c); push_loc(&s, r, c - 1); push_loc(&s, r, c + 1); element tmp; tmp.r = r; tmp.c = c; push(&sm, tmp); path_length++; backtracking_load(&s, r, c,&sm); if (is_empty(&s)) { printf("½ÇÆÐ\n"); return; } else here = pop(&s); } printf("¼º°ø\n"); print_path(&sm); return 0; }