题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=58
广搜问题,每个步骤的含义都写在代码里面了。欢迎大家相互交流,
代码:
#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
int a[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 b[4]={-1,1,0,0};//**往上下左右四个方向**//
int c[4]={0,0,-1,1};
int visit[9][9];
struct node
{
int x,y;//**坐标**//
int step;//**步数**//
};
queue<node> Q;
int bfs(int x1,int y1,int x2,int y2)
{
int i,s,t;
node e={x1,y1,0};//**从(x1,y1)开始,步数首先定义为0**//
Q.push(e);//**将可以走的方格都插入到队列**//
visit[x1][y1]=1;//**标记visit[x1][y1]曾经被访问过**//
while(!Q.empty())//如果队列不为空**//
{
e=Q.front(); //**e设为队列的第一个元素**//
if(e.x==x2 && e.y==y2)//如果找到就跳出循环**//
{
break;
}
Q.pop();//**取出队列的第一个元素**//
for(i=0;i<4;i++)
{
s=e.x+b[i];//四个方向进行搜索**//
t=e.y+c[i];
if(s>=0 && s<=8 && t>=0 && t<=8 && !visit[s][t] && a[s][t]==0)//**未曾访问过这个格子而且这个格子能继续走**//
{
node e1={s,t,e.step+1};//**步数+1**//
Q.push(e1);//**插入步数+1的元素**//
visit[s][t]=1;//**标记visit[s][t]被访问过**//
}
}
}
if(Q.empty())//**进入死胡同,到达不了**//
{
return -1;
}
while(!Q.empty())//**如果队列不为空**//
{
Q.pop();//**清空队列**//
}
return e.step;//**返回最少步数**//
}
int main()
{
int k,s,x1,x2,y1,y2;
scanf("%d",&s);
while(s--)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
memset(visit,0,sizeof(visit));
k=bfs(x1,y1,x2,y2);
printf("%d\n",k);
}
return 0;
}