1.练习项目 :
问题描述
小蓝有一天误入了一个混境之地。
好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息:
- 混境之地是一个 n⋅m 大小的矩阵,其中
#表示墙,无法通行,.表示普通的道路,k表示散落在地图中的钥匙。 - 他现在所在位置的坐标为 (A,B) ,而这个混境之地出口的坐标为 (C,D) ,当站在出口时且携带最少一把钥匙即表示可以逃离混境之地。
- 地图中可能存在不止一把钥匙。
坏消息是:
- 地图中可能没有钥匙。
小蓝可以往上下左右四个方向行走,每走一步耗时一分钟。
小蓝想知道他能否逃离这个混境之地,如果可以逃离这里,输出最少需要消耗多少时间 ,反之输出 -1 。
输入格式
第一行输入两个正整数 n,m ,表示矩阵的大小。
第二行输入四个正整数 A,B,C,D ,表示小蓝当前所在位置的坐标,以及混境之地出口的坐标。
接下来输入 n 行,每行 m 个字符,表示混境之地的地图,其中 # 表示墙,无法通行, . 表示普通的道路, k 表示散落在地图中的钥匙。
输出格式
输出数据共一行一个字符串:
- 若小蓝可以逃离混境之地,则输出最少需要消耗多少时间 。
- 若小蓝无法逃离混境之地,则输出
-1。
2.选择课程
在蓝桥云课中选择题库,选择题号5000并开始练习。
3.开始练习
(1)源码 :
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
char mpNN;
int disbNN,diseNN;
int dx\[\]={1,-1,0,0};
int dy\[\]={0,0,1,-1};
vector<pair<int,int>>v;
int n,m,a,b,c,d,e;
void bfs(int x,int y,int dis\[\]N)
{
disxy=0;
queue<pair<int,int>>q;
q.push({x,y});
while(q.size()){
pair<int,int>h=q.front();
q.pop();
for(int i=0;i<4;i++){
int px=h.first,py=h.second;
int nx=px+dxi,ny=py+dyi;
if(nx<1||ny<1||nx>n||ny>m)continue;
if(mpnxny=='#')continue;
if(disnxny>dispxpy+1){
q.push({nx,ny});
disnxny=dispxpy+1;
}
}
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie();
cin>>n>>m;
cin>>a>>b>>c>>d;
int tag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mpij;
if(mpij=='k')tag=1;
}
}
if(!tag){
cout<<-1<<'\n';
return 0;
}
memset(disb,0x3f3f3f3f,sizeof(disb));
memset(dise,0x3f3f3f3f,sizeof(dise));
bfs(a,b,disb),bfs(c,d,dise);
int step=0x3f3f3f3f;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(disbij=='k')
step=min(step,disbij+diseij);
}
}
if(step==0x3f3f3f3f)cout<<-1<<'\n';
else cout<<step<<'\n';
return 0;
}
(2)检验结果
对此代码进行检验,检验后无报错,运行此代码,运行结果正确。
(3)练习心得:
注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。