最少步数
时间限制:
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,10表示道路,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
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
学长讲的第一道 bfs 题目,不过当时自己没听课,只想听思想,而不是看代码......
现在自己做了一遍,感觉挺简单的,比较简单的搜索模板题目,注意入队的条件控制,以及标记的使用,这样类型的题,基本上没多少问题,只是可能题目不同,具体考虑的内容不一样....具体看代码注释...
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int a,b,c,d;
int v[10][10],fx[4]={-1,0,0,1},fy[4]={0,-1,1,0};
int maze[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 migong
{
int xi,yi;
int step;//这里存走了几步
}temp,site;
void bfs()
{
queue<migong> q;//在函数里定义,省去了清零的步骤,刚发现,爽爆了~~
v[a][b]=1;q.push(site);//首元素入队
while(!q.empty())
{
site=q.front();q.pop();
if(site.xi==c&&site.yi==d)
{
return;
}
int ts=site.step+1;
for(int i=0;i<4;++i)//四个方向拓展状态
{
int tx=site.xi+fx[i],ty=site.yi+fy[i];
if(tx<0||tx>8||ty<0||ty>8||maze[tx][ty]==1)//入队条件判断
{
continue;
}
if(!v[tx][ty])//未出现过
{
temp.xi=tx;temp.yi=ty;temp.step=ts;
q.push(temp);//入队
v[tx][ty]=1;//标记当前状态
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
memset(v,0,sizeof(v));//注意初始化
site.xi=a;site.yi=b;site.step=0;
bfs();
printf("%d\n",site.step);
}
return 0;
}