直接附上代码,具体题目需要直接改编才能达到目的:
注意使用条件:模板假定起点一定可以移动到终点,其他情况需要根据题目改编扩展;
#include<queue>
#include<iostream>
using namespace std;
#include<algorithm>
const int INF=1e9;
const int MAX=1000+10;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
typedef pair<int,int> P;
char maze[MAX][MAX];
int N,M;
int sx,sy;//起点
int gx,gy;//终点
int d[MAX][MAX];//到各个位置最短距离的数组
int 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();
if(p.first==gx&&p.second==gy)
break;//终点结束
//四个方向循环
for(int i=0;i<4;i++){
int nx=p.first+dx[i],ny=p.second+dy[i];
//判断check
if(nx>=0&&ny>=0&&nx<N&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}
int main(){
//输入
return 0;
}
具体的一道题目:Aizu - 0558-经典迷宫改编好题。
https://blog.csdn.net/queque_heiya/article/details/104086807
另外的一个模板,可以判断没有路可走,具体见代码就可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<cstdio>
using namespace std;
int n,m;
const int MAX=1000+10;
char maze[MAX][MAX];
bool vis[MAX][MAX];//标记数组
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};//方向数组
bool dfs(int x, int y){
if(maze[x][y]=='T'){//终点退出
return true;
}
vis[x][y]=1;
maze[x][y]='m';//用m标记,之后统计TTTT
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(0<=tx&&tx<n&&0<=ty&&ty<m&&maze[tx][ty]!='*'&&!vis[tx][ty]){
if(dfs(tx,ty)){
return true;
}
}
}
vis[x][y]=0;
maze[x][y]='.';
return false;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(maze,0,sizeof(maze));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%s",maze[i]);
}
int x,y;//定义起点x,y;
for(int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (maze[i][j]=='S'){
x=i,y=j;//找起点
break;
}
}
}
int ans=0;
bool flag=dfs(x,y);
if(flag){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(maze[i][j]=='m')
ans++;
}
//ans即为最短路径
cout<<ans<<endl;
}
}
/*
输入:
5 6
....S*
.***..
.*..*.
*.***.
.T....
输出:
9*/