目录
1.描述
海上巡逻队收到了求救信号,经确认信号由大山号发出,时间就是生命,必须尽快赶到那里。
通过导航卫星的侦测,巡逻队获得了一张海洋图。地图上这块区域划分成n * n个比较小的区域,其中用‘*’表示岛屿,用‘.’表示海洋,巡逻队当前在位置(1,1)。船只航行中只能从一个区域移到相邻的8个区域。
计算巡逻队最少需要航行的距离。
注意:一块区域距离为1。
2.输入输出
输入描述
第一行一个整数n(n<=50),表示海洋图的大小。
下面是一个n*n的海洋图。
最后一行有2个不大于n的正整数,表示大山号的位置。
输出描述
一个整数,表示巡逻队到大山号的最短距离;无法到达输出-1。
样例输入 1
4 .... .**. ..*. *... 4 4
样例输出 1
4
3.代码
#include<bits/stdc++.h>
using namespace std;
struct no{
int x,y,step;
};
queue <no> q;
int dx[8]={1,1,0,-1,-1,-1,0,1},ex,ey,vis[51][51],n;
char mp[51][51];
int dy[8]={0,1,1,1,0,-1,-1,-1};
void bfs() {
no a={1,1,0};vis[1][1]=1;q.push(a);
while(q.empty()!=1){
no f=q.front();
if(f.x==ex && f.y==ey){
cout<<f.step;return;
}
for (int i = 0; i < 8; i++) {
int nx = f.x + dx[i];
int ny = f.y + dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=n&&mp[nx][ny]=='.'&&vis[nx][ny]==0){
vis[nx][ny]=1;
no r={nx,ny,f.step+1};
q.push(r);
}
}
q.pop();
}
cout<<-1;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cin >> mp[i][j];
}
cin>>ex>>ey;
bfs();
return 0;
}