最少步数(bfs)

时间:2021-02-05 19:06:45

最少步数

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述

这有一个迷宫,有0~8行和0~8列:

1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

 
输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1 5 7
3 1 6 7
样例输出
12
11
TLE code
 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int a,b,c,t;
int map[][][];
int Min=;
int dirx[]={,,,-},diry[]={,-,,},dirz[]={,-};
int dfs(int z,int x,int y,int step)
{
int i,j;
if(step>t||z<||z>=a||x<||x>=b||y<||y>=c)
return ;
if(map[z][x][y])
return ;
if(x==b-&&y==c-&&z==a-)
{
Min=min(Min,step);
return ;
}
else
{
step++;
map[z][x][y]=;
for(i=;i<;i++)
{
int xx=x+dirx[i],yy=y+diry[i];
dfs(z,xx,yy,step);
}
for(i=;i<;i++)
{
int zz=z+dirz[i];
dfs(zz,x,y,step);
}
map[z][x][y]=;
}
return ;
}
int main()
{
int k,i,j,p;
//freopen("in.txt","r",stdin);
cin>>k;
while(k--)
{
Min=;
cin>>a>>b>>c>>t;
for(i=;i<a;i++) //层
for(j=;j<b;j++)
for(p=;p<c;p++)
cin>>map[i][j][p];
dfs(,,,);
if(Min>t)
cout<<-<<endl;
else
cout<<Min<<endl;
}
}

AC code

 #include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a,b,c,d,m;
int x[][]={
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
};
int bfs(int p,int q,int s)
{
if(x[p][q]==)
return ;
if(p==c&&q==d)
{
m=min(s,m);
return ;
}
s++;
x[p][q]=;//不再返回
bfs(p-,q,s);//向四周搜索
bfs(p+,q,s);
bfs(p,q+,s);
bfs(p,q-,s);
x[p][q]=;//不得返回。。。看了半天才明白
return ;
}
int main()
{
int N;
cin>>N;
while(N--)
{
cin>>a>>b>>c>>d;
m=;
bfs(a,b,);
cout<<m<<endl;
}
return ;
}