离开迷宫

时间:2014-02-10 18:17:19

标签: algorithm

迷宫是一个有n行和m列的矩形。迷宫的每个单元格是一个房间,第i行和第j列的房间被称为房间(i,j)。行从下到上编号从1到n,列从左到右编号为1到m。

迷宫有两种类型的房间:A型和B型。在A型的每个房间里,都有一个非常饥饿的怪物,我们必须给他一个糖果。房间还包含一枚金币。在B型的每个房间里,都有一个非常贪婪的警卫,我们必须给他一枚金币。房间里还有糖果。

每个房间都有一扇门通往每个相邻的房间(共享边缘的房间是相邻的房间)。在进入迷宫之前我们可以选择购买金币或糖果。如果人从房间(1,1)进入迷宫,他必须到达房间(n,m)才能走出迷宫。我们需要他所需要的最少房间才能走出迷宫。如果不可能,那么也返回-1

示例:迷宫是3 * 3,表示N = 3,M = 3

然后让0型A室和1型B室

0 1 1

0 0 1

0 0 0

要离开迷宫,必须至少通过5个房间。

1 个答案:

答案 0 :(得分:2)

以下是C ++中的代码,您可以问我任何疑问,我使用了BFS并测试了一些案例:

#include <stdio.h>
#include <queue>

static const int MAX = 1000;

//this matrix store the current minimum value (0,0) ----> (i,j)
static int maze[MAX][MAX];
//original value matrix
static bool flagMatrix[MAX][MAX];
//matrix used to mark visited nodes in the bfs
static bool marked[MAX][MAX];

using namespace std;

int dx[4] = { -1, +1, -0, +0};
int dy[4] = { +0, +0, -1, +1};

struct point {
    int x;
    int y;

    point(int x1, int y1) {
        x = x1;
        y = y1;
    }
};

//this function check if the point is inside the bounds of the maze matrix
bool inRange(struct point p, int n, int m) {
    return 0 <= p.x && p.x < n && 0 <= p.y && p.y < m;
}

int main()
{
    int xn, ym;

    scanf("%d %d",&xn,&ym);

    for (int i = 0; i < ym; i++)
        for (int j = 0; j < xn; j++) {
            scanf("%d",&flagMatrix[j][i]);
            maze[j][i] = MAX + 1;
        }

    maze[0][0] = 1;
    queue<struct point> q;

    point init(0,0);
    q.push(init);

    //BFS
    while(!q.empty()) {

        point current = q.front();
        marked[current.x][current.y] = true;
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            point children(current.x + dx[i],current.y + dy[i]);

            if(inRange(children,xn,ym) && !marked[children.x][children.y] && flagMatrix[current.x][current.y] != flagMatrix[children.x][children.y]) {
                //here is the key condition
                maze[children.x][children.y] = min(maze[children.x][children.y],maze[current.x][current.y] + 1);
                q.push(children);
            }
        }
    }

    printf("%d\n", maze[xn - 1][ym - 1] == MAX + 1 ? -1 : maze[xn - 1][ym - 1]);

    return 0;
}