问题 G: 最少步数
时间限制: 3 Sec 内存限制: 64 MB[ 提交][ 状态][ 讨论版]
题目描述
这有一个迷宫,有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)分别表示起点的行、列,终点的行、列。
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1 5 7
3 1 6 7
样例输出
12
11
提示
BFS模板题,最好学会使用数据结构 queue
# include<stdio.h>
# include<queue>
using namespace std;
int c[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
},a[9][9];
int begin1,begin2,end1,end2,b[4][2]={0,1,-1,0,1,0,0,-1};
struct node{
int x,y;
int step;
friend bool operator <(node a,node b)
{
a.step>b.step;
}
};//用优先队列使输出的步数最小
void dfs()
{ queue<node>s;
node q,p;
q.step=0;
q.x=begin1;
q.y=begin2;
s.push(q);
while(!s.empty())
{
q=s.front();
s.pop();
if(q.x==end1&&q.y==end2) //判断是不是到达目的地
{
printf("%d\n",q.step);
return ;
}
for(int i=0;i<4;i++)
{
p.x=q.x+b[i][0];
p.y=q.y+b[i][1];
p.step=q.step+1;
if(p.x>=0&&p.y>=0&&p.x<9&&p.y<9&&a[p.x][p.y]!=1)//判断是不是符合题意
{
a[p.x][p.y]=1;//不在重复走
s.push(p);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{ for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
a[i][j]=c[i][j];//因为要对该数组修改,另设一个数组
scanf("%d%d%d%d",&begin1,&begin2,&end1,&end2);
dfs();
}
return 0;
}