题目链接: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; }