难度:
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组测试数据;
#include<stdio.h>
#include<queue>//队列头文件
using namespace std;
int d[4][2]={-1,0,0,1,1,0,0,-1}; //搜索方向
struct point
{
int x,y,step;
};
int bfs(point s,point t,int map[9][9])
{
queue<point> que;//建立队列
int i;
point p; //临时中间变量
que.push(s); //真心不知道注释出为什么是不对的,就是不能AC
// while(1)
// {
// if(s.x==t.x&&s.y==t.y) //找到位置
// return s.step;
// for(i=0;i<4;++i)
// {
// p.x=s.x+d[i][0];
// p.y=s.y+d[i][1];
if(p.x<0||p.x>8||p.y<0||p.y>8) //超出临界
continue; //继续走
// if(map[p.x][p.y]==0) //此路可走
// {
// map[p.x][p.y]==1; //走过标记
// p.step=s.step+1;//增加步数
// que.push(p) ;//位置入队
// }
//
// }
// s=que.front();//继续搜索
// que.pop();// 并且出队
// }
while(1)
{
if(s.x==t.x&&s.y==t.y)
return s.step;
for(i=0;i<4;++i)
{
p.x=s.x+d[i][0];
p.y=s.y+d[i][1];
if(map[p.x][p.y]==0)
{
p.step=s.step+1;
map[p.x][p.y]=1;
que.push(p);
}
}
s=que.front();
que.pop();
}
}
int main()
{
int T;
point start ,end;//定义结构体开始位置及末位置
scanf("%d",&T);
while(T--)
{
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,
};
scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
map[start.x][start.y]=1;
start.step=0;
printf("%d\n",bfs(start,end,map));
}
return 0;
}