逃离迷宫2
限制 : 10000 MS 65536 KB
问题描述
有一个方格迷宫,我们可以将它看作一个n*m的矩阵,每个方格表示一个房间,方格中有数字0和1,数字0表示该房间是空的,可以顺利通过,数字1表示该房间有怪兽,不能通过。
一开始何老板位于左上角的方格(坐标[1,1]位置),他要走到右下角的出口(坐标[n,m]位置),每一步何老板可以往上、下、左、右走。
他想知道最少需要几步就可以走出迷宫?
输入格式
第一行,两个整数n和m
接下来是一个有数字0和1构成的n*m的矩阵,表示迷宫
输出格式
一个整数,表示最小步数。若无解,输出-1
样例输入
4 5
0 0 0 0 0
0 1 1 1 0
0 1 0 0 0
0 0 0 1 0
样例输出
7
提示
1<=n,m<=20
思路:
和逃离迷宫1一样,都是DFS模板题
只不过我用的是BFS
废话不说,直接上代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int x;
int y;
int step;
};
queue<node> q;
int n,m;
int a[30][30];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int u;
void bfs()
{
node now;
now.x = 1;
now.y = 1;
now.step = 0;
q.push(now);
while(!q.empty())
{
int sx = q.front().x;
int sy = q.front().y;
int sstep = q.front().step;
q.pop();
a[sx][sy] = 1;
for(int k=0;k<4;k++)
{
int xx = sx+dx[k];
int yy = sy+dy[k];
if(xx>=0&&xx<=n&&yy>=0&&yy<=m&&a[xx][yy]==0)
{
a[xx][yy] = 1;
now.x = xx;
now.y = yy;
now.step = sstep + 1;
q.push(now);
}
if(xx==n&&yy==m)
{
printf("%d",now.step);
u = 1;
return;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
bfs();
if(u==0)
{
printf("-1");
}
return 0;
}
The end
最后:点个赞和关注再走吧!