2011年12月15日 星期四

Maze Traversal

用右手一直貼著牆走迷宮,最後一定會找到出口

#include <stdio.h>

enum DIR {left, right, up, down};

void mazeTraverse(char (* maze)[12], int s_x, int s_y, int g_x, int g_y)
{
    int i, j;
    int x, y;
    enum DIR dir;

    x = s_x, y = s_y;
    if (y == 0)
        dir = right;
    else if (x == 0)
        dir = down;
    else if (y == 11)
        dir = left;
    else
        dir = up;

    while (1)
    {
        maze[x][y] = 'X';
        if (dir == right)
        {
            if (maze[x+1][y] != '#')
            {
                x++;
                dir = down;
            }
            else
            {
                if (maze[x][y+1] == '#')
                    dir = up;
                else
                    y++;
            }
        }
        else if (dir == left)
        {
            if (maze[x-1][y] != '#')
            {
                x--;
                dir = up;
            }
            else
            {
                if (maze[x][y-1] == '#')
                    dir = down;
                else
                    y--;
            }
        }
        else if (dir == up)
        {
            if (maze[x][y+1] != '#')
            {
                y++;
                dir = right;
            }
            else
            {
                if (maze[x-1][y] == '#')
                    dir = left;
                else
                    x--;
            }
        }
        else if (dir == down)
        {
            if (maze[x][y-1] != '#')
            {
                y--;
                dir = left;
            }
            else
            {
                if (maze[x+1][y] == '#')
                    dir = right;
                else
                    x++;
            }
        }

        if (x == g_x && y == g_y)
        {
            maze[x][y] = 'G';
            break;
        }
    }
}

int main(void)
{
    char maze[12][12] = {
        '#','#','#','#','#','#','#','#','#','#','#','#',
        '#','.','.','.','#','.','.','.','.','.','.','#',
        '.','.','#','.','#','.','#','#','#','#','.','#',
        '#','#','#','.','#','.','.','.','.','#','.','#',
        '#','.','.','.','.','#','#','#','.','#','.','.',
        '#','#','#','#','.','#','.','#','.','#','.','#',
        '#','.','.','#','.','#','.','#','.','#','.','#',
        '#','#','.','#','.','#','.','#','.','#','.','#',
        '#','.','.','.','.','.','.','.','.','#','.','#',
        '#','#','#','#','#','#','.','#','#','#','.','#',
        '#','.','.','.','.','.','.','#','.','.','.','#',
        '#','#','#','#','#','#','#','#','#','#','#','#',
    };
    int i, j;

    mazeTraverse(maze, 2, 0, 4, 11);
    for (i = 0; i < 12; i++)
    {
        for (j = 0; j < 12; j++)
            printf("%c", maze[i][j]);
        printf("\n");
    }

    return 0;
}

1 則留言: