/* 16 puzzle problem - 8~9´Â ¿Ç´Ù°í °¡Á¤ÇÏ°í 1~7¿¡ ´ëÇؼ­¸¸ Àû¿ë - 1°ú 2ÀÇ À§Ä¡¸¸ ¹Ù²î¾úÀ» ¶§ 1...7 ¼ø¼­¸¦ ã´Â ÇÁ·Î±×·¥ 1...7 À» 'A'...'G'·Î mappingÇÏ¿© ±¸Çö --> 15±îÁö È®ÀåÇÏ·Á¸é ºñ¾îÀÖ´Â cellÀº '@' ¹®ÀÚ */ #include #include #define N_SYMBOLS 8 #define EMPTY_SYMBOL '@' #define MAX_STATES 50000 #define SOURCE "@BACDEFG" #define TARGET "@ABCDEFG" /* - Breadth-First Search ¾Ë°í¸®Áò - Ãʱâ»óÅ·κÎÅÍ µµ´Þ °¡´ÉÇÑ ¸ðµç »óŸ¦ ÀúÀå */ long n=0; /* number of entries for 's' */ char s[MAX_STATES][N_SYMBOLS+1]; /* µµ´Þ °¡´ÉÇÑ ¸ðµç »óŸ¦ ÀúÀå */ int move_up(int i, char x[]) { x[i] = x[i-4]; x[i-4] = EMPTY_SYMBOL; return i-4; } int move_down(int i, char x[]) { x[i] = x[i+4]; x[i+4] = EMPTY_SYMBOL; return i+4; } int move_left(int i, char x[]) { x[i] = x[i-1]; x[i-1] = EMPTY_SYMBOL; return i-1; } int move_right(int i, char x[]) { x[i] = x[i+1]; x[i+1] = EMPTY_SYMBOL; return i+1; } put_cells(char *space, char x[]) { int i; printf("%s", space); for (i = 0; i < 4; i++) printf("%d", x[i]-EMPTY_SYMBOL); printf("\n"); printf("%s", space); for (i = 4; i < 8; i++) printf("%d", x[i]-EMPTY_SYMBOL); printf(":%s\n", x); } /* if 'x' doesn't exist, added it. */ void add_new_state(char x[]) { long i; if (!strcmp(x, TARGET)) { printf("O.K."); exit(0); } for (i = 0; i < n; i++) if (!strcmp(x, s[i])) return; if (n < MAX_STATES-1) strcpy(s[n++], x); else { puts("STACK OVERFLOW!"); exit(0); } put_cells("\t", x); } void expand(long k) /* expand s[k] */ { char x[N_SYMBOLS+1]; int i; /* empty-cell position */ strcpy(x, s[k]); for (i = 0; i < N_SYMBOLS; i++) if (x[i] == EMPTY_SYMBOL) break; put_cells("", x); switch (i) { case 0: i = move_down(i, x); add_new_state(x); i = move_up(i, x); i = move_right(i, x); add_new_state(x); break; case 1: case 2: i = move_down(i, x); add_new_state(x); i = move_up(i, x); i = move_left(i, x); add_new_state(x); i = move_right(i, x); i = move_right(i, x); add_new_state(x); break; case 3: i = move_down(i, x); add_new_state(x); i = move_up(i, x); i = move_left(i, x); add_new_state(x); break; case 4: i = move_up(i, x); add_new_state(x); i = move_down(i, x); i = move_right(i, x); add_new_state(x); break; case 5: case 6: i = move_up(i, x); add_new_state(x); i = move_down(i, x); i = move_left(i, x); add_new_state(x); i = move_right(i, x); i = move_right(i, x); add_new_state(x); break; case 7: i = move_up(i, x); add_new_state(x); i = move_down(i, x); i = move_left(i, x); add_new_state(x); break; } } /* 'n' is increased by 'expand()' */ void BFS() { long i; for (i = 0; i < n; i++) expand(i); /* expand s[i] */ } void main() { strcpy(s[n++], SOURCE); BFS(); puts("BFS ended!"); }