迷宫是一个有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个房间。
答案 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;
}