您的位置:首页 > 其它

POJ 2251 Dungeon Master (三维BFS)

2013-12-19 18:22 573 查看
Dungeon Master



大意:给你一个三维的地图,可以上下左右前后的运动,求从‘S’到‘E’的对短距离。



思路: 训练计划上说是DFS,敲着敲着发现敲不动了,就BFS了。

#include <stdio.h>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;

int Map[35][35][35];
int s_x, s_y, s_z;
int b_x, b_y, b_z;
int e_x, e_y, e_z;
bool dis[35][35][35];
int ans[300000];
int d[][3] = {{-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1}};
int Ans;

struct node
{
    int x, y, z;
} t[300000];

bool is_board(int a, int b, int c)
{
    if(a >= 1 && a <= b_x && b >= 1 && b <= b_y && c >= 1 && c <= b_z)
        return true;
    return false;
}

int BFS()
{
    int front, rear;
    int dx, dy, dz;
    memset(dis, 0, sizeof(dis));
    memset(ans, 0, sizeof(ans));
    t[0].x = s_x, t[0].y = s_y, t[0].z = s_z;
    //printf("%d %d %d\n", t[0].x, t[0].y, t[0].z);
    front = rear = 0;
    while(front <= rear)
    {
        for(int i = 0; i < 6; i++)
        {
            dx = t[front].x + d[i][0];
            dy = t[front].y + d[i][1];
            dz = t[front].z + d[i][2];
            //printf("#%d %d %d\n", dx, dy, dz);
            if(!dis[dx][dy][dz] && Map[dx][dy][dz] && is_board(dx, dy, dz))
            {
                //printf("*%d %d %d\n", dx, dy, dz);
                dis[dx][dy][dz] = true;
                t[++rear].x = dx;
                t[rear].y = dy;
                t[rear].z = dz;
                ans[rear] = ans[front]+1;
                // printf("%d %d %d\n", e_x, e_y, e_z);
                //printf("%d\n", rear);
                if(dx == e_x && dy == e_y && dz == e_z)
                    return ans[rear];
            }
        }
        front++;
    }
    return 0;
}

void Solve()
{
    char c;
    while(~scanf("%d%d%d%*c", &b_x, &b_y, &b_z))
    {
        if(!b_x && !b_y && !b_z)
            break;
        memset(Map, 0, sizeof(Map));
        for(int i = 1; i <= b_x; i++)
        {
            for(int j = 1; j <= b_y; j++)
            {
                for(int k = 1; k <= b_z; k++)
                {
                    scanf("%c", &c);
                    if(c == 'S')
                        s_x = i, s_y = j, s_z = k;
                    else if(c =='E')
                    {
                        e_x = i, e_y = j, e_z = k;
                        Map[i][j][k] = 1;
                    }
                    else if(c =='.')
                        Map[i][j][k] = 1;
                    else
                        Map[i][j][k] = 0;
                }
                getchar();
            }
            if(i != b_x)
                getchar();
        }
        Ans = BFS();
        if(Ans)
            printf("Escaped in %d minute(s).\n", Ans);
        else
            printf("Trapped!\n");
    }
}

int main(void)
{
    Solve();

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: