最小步数
题目来源:点击打开链接
题目信息:这道题就是一个简单的迷宫搜索,可以用队列作简单模拟。
源代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct num{
int x,y; //坐标
int step; //步数
};
queue<num>Q; //定义一个结构体类型的队列
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 fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //方向
int visit[9][9]; //标记足迹
int mg(int x1,int y1,int x2,int y2) //计算最小步数
{
num e={x1,y1,0}; //将起点位置付给e,步数为0
Q.push(e);
visit[x1][y1]=1; //标记此处走过
while(!Q.empty())
{
e=Q.front(); //将队首付给e
if(e.x==x2&&e.y==y2) //判断是否到达了目的地
break;
Q.pop();
int i,s,t;
for(i=0;i<4;i++) //向其他方向查找下一步
{
s=e.x+fx[i][0];
t=e.y+fx[i][1];
if(s>=0&&s<=8&&t>=0&&t<=8&&!visit[s][t]&&map[s][t]==0) //判断边界
{
num e1={s,t,e.step+1}; //步数+1
Q.push(e1); //将步数+1的元素入队
visit[s][t]=1; //标记走过的位置
}
}
}
while(!Q.empty()) //清空队列
Q.pop();
return e.step; //返回最小步数
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int k;
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
memset(visit,0,sizeof(visit)); //清除标记
k=mg(x1,y1,x2,y2);
printf("%d\n",k);
}
return 0;
}