小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。
问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障碍物不能走,小哼也不能走出迷宫外)
输入例如:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
输出:
7
深搜
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N
int p,q,n,m;//p,q为终点坐标,n,m为迷宫大小
int book[51][51],a[51][51];//book数组为标记是否用过,a数组用来存放迷宫
int mins=9999999;//用来更新最小值
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//next数组为方向数组
void dfs(int x,int y,int step){
if(x==p&&y==q){//终止条件
if(step<mins){
mins=step;
}
return ;
}
int tx,ty;
for(int i=0;i<4;++i){//循环各种可能
tx=x+next[i][0];
ty=y+next[i][1];
if(tx>n||ty>m||tx<1||ty<1){//看是否越界
continue;
}
if(book[tx][ty]==0&&a[tx][ty]==0){//如果符合条件
book[tx][ty]=1;//标记为访问过
dfs(tx,ty,step+1);//进入下一个位置的搜索
book[tx][ty]=0;//返回时要撤销标记
}
}
}
int main(){
int sx,sy;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
cin>>sx>>sy>>p>>q;
dfs(sx,sy,0);
cout<<mins<<endl;
return 0;
}
广搜
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N
struct node{
int x,y,s;//x,y是坐标信息,s是步数
};
int head,tail;//队列的头和尾
struct node queue[2510];
int a[51][51];//存放地图信息
int book[51][51];//判断地图某一点是否被访问过
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main(){
int n,m,sx,sy,p,q,tx,ty,flag;
//n,m为行,列数,sx,sy为起点坐标,p,q为终点坐标,tx,ty为中间临时存放改变的x,y值,flag来标记是否到终点
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
cin>>sx>>sy>>p>>q;
//初始化
head=tail=1;
queue[tail].x=sx;
queue[tail].y=sy;
queue[tail].s=0;
tail++;
flag=0;
//进入循环
while(head<tail){
for(int i=0;i<4;i++){
//位置更新
tx=queue[head].x+next[i][0];
ty=queue[head].y+next[i][1];
//判断是否出界
if(tx<1||ty<1||tx>n||ty>m){
continue;
}
//判断是否符合条件
if(book[tx][ty]==0&&a[tx][ty]==0){
book[tx][ty]=1;
queue[tail].x=tx;
queue[tail].y=ty;
queue[tail].s=queue[head].s+1;
tail++;
}
//如果到达终点,进行标记
if(tx==p&&ty==q){
flag=1;
break;
}
}
//最重要的地方
head++;
if(flag==1){
break;
}
}
cout<<queue[tail-1].s<<endl;
return 0;
}