分数 10
全屏浏览题目
切换布局
作者 彭昊
单位 吉首大学
小H十分喜欢睡觉,这天他起来一看,居然9.30了,而他答应了10点要到小W家去,小H想走知道小H到小W家的最短时间是多少,你能帮帮他吗。
地图是n * m的网格,每个单元是一个开放空间或建筑物(无法通过),小H的加在(1,1),小W 在(x,y)处,他只能上下左右移动,每一步需要1分钟。 输入数据可确保小W家可到达。
输入格式:
第一行具有两个正整数n,m,以空格(1 <= n,m <= 100)隔开,n为行,m为列
接下来是两个正整数x,y,用空格隔开(1 <= x <= n,1 <= y <= m)指示教学大楼的坐标
接下来是n行和m列的地图,0表示开放空间,1表示障碍物。
输出格式:
对于每个测试用例,输出一行包含整数的行,该行给出了小H到达小W家所需的最短时间(以分钟为单位)。
输入样例:
5 4
4 3
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
输出样例:
7
我刚开始用dfs发现一直会出现超时现象,后来改成bfs直接过了
代码放在下方 ,有不懂的兄弟,请移步b站https://www.bilibili.com/video/BV16C4y1s7EF/?spm_id_from=333.788.recommend_more_video.1&vd_source=0c82ddfe85514943b8cdbbd570f955f7
这个视频,虽然讲的一般,但是真的很详细,希望兄弟们可以认真看完,
#include<bits/stdc++.h>
using namespace std;
int a[108][108],visited[108][108];
int endx,endy;
int n,m;
int minn=INT_MAX;
struct node{
int x;
int y;
int step;
};
int dx[4]={0,-1,0,1};
int dy[4]={1,0,-1,0};
void bfs(int x,int y){
node t;
t.x=x;
t.y=y;
t.step=0;
queue<node>q;
q.push(t);
visited[x][y]=0;
while(!q.empty()){
int tx=q.front().x;
int ty=q.front().y;
if(tx==endx&&ty==endy){
minn=min(minn,q.front().step);
break;
}
for(int i=0;i<4;i++){
int xx=tx+dx[i];
int yy=ty+dy[i];
if(visited[xx][yy]==0&&a[xx][yy]!=1&&xx>0&&xx<=n&&yy>0&&yy<=m){
visited[xx][yy]=1;
node temp;
temp.x=xx;
temp.y=yy;
temp.step=q.front().step+1;
q.push(temp);
}
}
q.pop();
}
}
int main()
{
cin>>n>>m;
cin>>endx>>endy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
bfs(1,1);
cout<<minn<<endl;
return 0;
}