迷宫
Description
小C最近在研究机器人,他想看看自己的机器人够不够智能,于是他将机器人放在一个n*m的迷宫中,看看机器人能不能在最短的时间内到达目的地,可是小C不知道最短的时间是多少,现在请你帮他算算机器人到达目的地的最短时间是多少?
输入数据第一行两个整数n和m。
接下来n行,每行m个元素,表示迷宫的每个方格。
'S'表示机器人的出发点,
'T'表示目的地,
'#'表示该方格不能通过
'.'表示可以通过
输出一个整数表示机器人到达目的地的最短时间,如果机器人不能到达目的地,输出-1。
3 3
S..
##.
.T.
S..
##.
.T.
5
解题思路:
1.从起点开始,先将其加入队列,设置距离为0;
2.从队列首端取出位置,将这个位置能达到的地方加入队列,并且让这些位置的距离变成上一个位置加一。
3.循环2直到将终点添加到队列中,这说明我们已经找到了路径。
注意到在这个过程中,每次处理的位置所对应的距离是严格递增的,因此一旦找到终点,当时的最短距离就是最短距离。
同样基于这个原因,搜索课移动到的位置所使用的判断条件中不仅仅是不碰墙壁,不超过边界,还有一个就是没有到达过,因为如果已经到达过这个位置,说明已经有更短的路径到达这个位置,这次到达这个位置的路径是更差的,不可能得到更好的最终解。
ac代码:
#include<bits/stdc++.h>
using namespace std;
int sx,sy,tx,ty;
#define inf 0x3f3f3f3f
typedef pair<int,int>P;
char maze[1005][1005];
int n,m,flag=0;
int d[1005][1005];//储存起点到某一点的距离
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(){
queue<P>que;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
d[i][j]=inf;
}
}
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size()){
P p=que.front();
que.pop();
int i;
for(i=0;i<4;i++){
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(nx>=0&&nx<n&&ny<m&&ny>=0&&maze[nx][ny]!='#'&&d[nx][ny]==inf){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
if(nx==tx&&ny==ty) {
flag=1;
break;
}
}
}
if(i!=4) break;
}
}
int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<n;i++){
cin>>maze[i];
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(maze[i][j]=='S'){
sx=i;
sy=j;
}
if(maze[i][j]=='T'){
tx=i;
ty=j;
}
}
}
bfs();
if(flag)
cout<<d[tx][ty]<<endl;
else
cout<<"-1"<<endl;
return 0;
}
using namespace std;
int sx,sy,tx,ty;
#define inf 0x3f3f3f3f
typedef pair<int,int>P;
char maze[1005][1005];
int n,m,flag=0;
int d[1005][1005];//储存起点到某一点的距离
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(){
queue<P>que;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
d[i][j]=inf;
}
}
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size()){
P p=que.front();
que.pop();
int i;
for(i=0;i<4;i++){
int nx=p.first+dx[i];
int ny=p.second+dy[i];
if(nx>=0&&nx<n&&ny<m&&ny>=0&&maze[nx][ny]!='#'&&d[nx][ny]==inf){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
if(nx==tx&&ny==ty) {
flag=1;
break;
}
}
}
if(i!=4) break;
}
}
int main()
{
int i,j;
cin>>n>>m;
for(i=0;i<n;i++){
cin>>maze[i];
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(maze[i][j]=='S'){
sx=i;
sy=j;
}
if(maze[i][j]=='T'){
tx=i;
ty=j;
}
}
}
bfs();
if(flag)
cout<<d[tx][ty]<<endl;
else
cout<<"-1"<<endl;
return 0;
}
============================================================================参考博客
声明:本文来自 疯狂的指针 的优快云博客,链接:http://blog.youkuaiyun.com/lrgdongnan/article/details/51773728