题目大意:在一个三维的空间,给出起点和终点,问是否能够从起点到达终点,若能则输出n和步数,不能则NO ROUTE.
解题思路:BFS的应用。详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1240
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 11;
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
char map[MAXN][MAXN][MAXN];
int sx,sy,sz,ex,ey,ez,n;
char str[10];
struct node{
int x,y,z,step;
};
int BFS(){
node t;
node s;
queue<node> q;
s.x=sx;s.y=sy;s.z=sz; //初始化
s.step=0;
q.push(s); //将起点放进队列中
map[s.x][s.y][s.z]='*'; //访问过则标记
while(!q.empty()){
node temp=q.front(); //每次获取队首元素
q.pop();
if(temp.x==ex && temp.y==ey && temp.z==ez) return temp.step; //如果搜索到终点,则返回走完的最短长度
for(int i=0;i<6;i++){ //进行每层遍历
t.x=temp.x+dir[i][0];
t.y=temp.y+dir[i][1];
t.z=temp.z+dir[i][2];
t.step=temp.step+1;
if(t.x>=0 && t.x<n && t.y>=0 && t.y<n &&t.z>=0 && t.z<n && map[t.x][t.y][t.z]=='O'){ //越界和条件判断
map[t.x][t.y][t.z]='*'; //走过就标记
q.push(t); //将满足条件的点放入队列,进入下次循环判断
}
}
}
return -1;
}
int main()
{
while(scanf("%s %d", str, &n) != EOF){
for(int i = 0; i < n; i++) //接收图,开始使用三层循环进行接收,然后结果始终不对,找了半天的错,最后换成两层循环一下就对了,想问有区别吗?汗。。
for(int j = 0; j < n; j++)
scanf("%s", map[i][j]);
scanf("%d %d %d %d %d %d", &sz, &sy, &sx, &ez, &ey, &ex);
scanf("%s", str);
int ans = BFS(); //BFS
if(ans == -1)
printf("NO ROUTE\n");
else
printf("%d %d\n", n, ans);
}
return 0;
}