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