一、题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。 小明只能向上下左右四个方向移动。
输入格式:
第一行是两个整数n和m (1≤ m, n ≤100),表示迷宫的长和宽。接下来是n行,每行m个数字,表示整个迷宫。空地格子用0表示,障碍物用1表示,小明所在起点用3表示,终点用4表示。
输出格式:
如果能够到达终点,输出一个整数,表示小明从起点到目的地所需的最短时间。如果不能到达终点,输出“unreachable”。
输入样例1:
5 5
1 0 1 1 1
1 0 4 1 0
1 0 0 1 0
0 0 0 1 0
1 0 3 0 1
结尾无空行
输出样例1:
3
结尾无空行
输入样例2:
5 5
3 0 1 1 1
1 0 1 1 0
1 0 1 1 0
0 0 0 1 0
1 0 1 0 4
结尾无空行
输出样例2:
unreachable
结尾无空行
二、代码
#include<iostream>
using namespace std;
int graph[100][100],visit[100][100];
//int step[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int ans=99999,n,m,fx,fy,x1,y1; //x,y表示起始位置x1,y1表示终点位置
void dfs(int x,int y,int count){
if(x==x1 && y==y1){ //到达终点
ans=min(ans,count); //取最小路径值
return; //结束当前函数
}
for(int i=0;i<4;i++){ //四个方向搜索
int xx=x+dx[i];
int yy=y+dy[i];
if(visit[xx][yy]==0 && graph[xx][yy]!=1 && xx>0 && xx<=n && yy>0 && yy<=m){ //没有越界,且不是障碍物,且没有被访问过
visit[xx][yy]=1; //标记为访问
dfs(xx,yy,count+1); //路径数+1继续搜索
visit[xx][yy]=0; //还原
}
}
}
int main(){
//输入
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>graph[i][j];
if(graph[i][j]==3){
fx=i,fy=j;
}else if(graph[i][j]==4){
x1=i,y1=j;
}
}
}
visit[fx][fy]=1;
dfs(fx,fy,0);
if(ans!=99999){
cout<<ans;
}else{
cout<<"unreachable";
}
return 0;
}