最少步数
时间限制: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
来源
上传者
DFS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<climits>
#include<queue>
#define M 10000
using namespace std;
int x,y,ex,ey,ans;
int map[9][9]={
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
};
int px[4]={-1,1,0,0};//×ߵķ½Ïò
int py[4]={0,0,-1,1};
void f(int x,int y,int c)
{
if(x==ex&&y==ey)
{
if(c<ans)
{
ans=c;
}
}
else
{
for(int i=0;i<4;i++)
{
int nx=x+px[i];
int ny=y+py[i];
if(map[nx][ny]==0&&c+1<ans)
{
map[nx][ny]=1;
f(nx,ny,c+1);
map[nx][ny]=0;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int c=0;
scanf("%d%d%d%d",&x,&y,&ex,&ey);
map[x][y]=1;
ans=M;
f(x,y,c);
printf("%d\n",ans);
map[x][y]=0;
}
return 0;
}
BFS
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int map[9][9]={
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,
};
struct node
{
int x,y,step;
};
bool vis[9][9];
int x,y,ex,ey;
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int BFS(){
node s;
s.x=x,s.y=y,s.step=0;
vis[x][y]=true;
queue<node>q;
q.push(s);
while(!q.empty()){
node now=q.front();
q.pop();
if(now.x==ex&&now.y==ey){
return now.step;
}
for(int i=0;i<4;i++){
node end;
end.x=now.x+dx[i];
end.y=now.y+dy[i];
end.step=now.step;
if(vis[end.x][end.y]==false&&map[end.x][end.y]==0)
{
vis[end.x][end.y]=true;
end.step+=1;
q.push(end);
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(vis,false,sizeof(vis));
scanf("%d%d%d%d",&x,&y,&ex,&ey);
int ans=BFS();
printf("%d\n",ans);
}
return 0;
}