include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAZE_SIZE 6
#define QUEUE_SIZE 100
typedef struct {
short r;
short c;
} element;
typedef struct {
element data[QUEUE_SIZE];
int front, rear;
} QueueType;
// Å¥ ÃʱâÈ ÇÔ¼ö
void init_queue(QueueType* q)
{
q->front = q->rear = 0;
}
// Å¥ °ø¹é »óÅ °ËÃâ ÇÔ¼ö
int is_empty(QueueType* q)
{
return (q->front == q->rear);
}
// Å¥ Æ÷È »óÅ °ËÃâ ÇÔ¼ö
int is_full(QueueType* q)
{
return ((q->rear + 1) % QUEUE_SIZE == q->front);
}
// Å¥¿¡ »ðÀÔÇÏ´Â ÇÔ¼ö
void enqueue(QueueType* q, element item)
{
if (is_full(q)) {
fprintf(stderr, "Å¥ Æ÷È ¿¡·¯\n");
return;
}
q->rear = (q->rear + 1) % QUEUE_SIZE;
q->data[q->rear] = item;
}
// Å¥¿¡¼ »èÁ¦ÇÏ´Â ÇÔ¼ö
element dequeue(QueueType* q)
{
if (is_empty(q)) {
fprintf(stderr, "Å¥ °ø¹é ¿¡·¯\n");
exit(1);
}
q->front = (q->front + 1) % QUEUE_SIZE;
return q->data[q->front];
}
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', '0', '1', '1' },
{ '1', '0', '1', '0', '0', 'x' },
{ '1', '1', '1', '1', '1', '1' },
};
// À§Ä¡¸¦ ½ºÅÿ¡ »ðÀÔ
void push_loc(QueueType* 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;
enqueue(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");
}
}
void Queue_print(QueueType* q) {
int i;
printf("°æ·Î ");
for (i = q->rear; i > 0; i--)
printf("-> (%01d,%01d) ", q->data[i].r, q->data[i].c);
}
int main(void)
{
int r, c;
QueueType s;
init_queue(&s);
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);
if (is_empty(&s)) {
printf("½ÇÆÐ\n");
return;
}
else
here = dequeue(&s);
}
printf("¼º°ø\n");
Queue_print(&s);
return 0;
}