杭电 1240题

//广度优先搜索
#include <iostream>
#include <string>
using namespace std;
#define mapsize 10
#define quesize 1100
int dir[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}}; //定义6个方向
char map[mapsize][mapsize][mapsize]; //定义三维地图
int sx,sy,sz; //定义起点
int ex,ey,ez; //定义终点
typedef struct node
{
 int x;
 int y;
 int z;
 int t;  //代表距离
}node;
node bfsqueue[quesize]; //定义广度优先搜索中的队列
int N;
int BFS()
{
 int i,j;
 int start = 0;  //定义队列的头部元素下标
 int end = 1;  //定义队列的最后一个元素的下一个元素
 int cux,cuy,cuz,cut;
 while(end!=start) //迭代终止条件
 {
  node frontnode= bfsqueue[start];
  cux = frontnode.x;
  cuy = frontnode.y;
  cuz = frontnode.z;
  cut = frontnode.t;
  if(cux == ex && cuy == ey && cuz == ez)
  {
   return cut;
  }
  start++;  //去除头部元素
  for(i=0;i<6;++i)
  {
   int tempx = cux+dir[i][0];
   int tempy = cuy+dir[i][1];
   int tempz = cuz+dir[i][2];
   if(tempx>=0 && tempx<N && tempy>=0 && tempy<N && tempz>=0 && tempz<N && map[tempx][tempy][tempz]=='O')
   {
    bfsqueue[end].x = tempx;
    bfsqueue[end].y = tempy;
    bfsqueue[end].z = tempz;
    bfsqueue[end].t = cut+1;
    map[tempx][tempy][tempz] = 'X';   //表明该点加入到了队列中
    if(bfsqueue[end].x == ex && bfsqueue[end].y == ey && bfsqueue[end].z == ez) //此处加一判断,减少迭代次数
    {
     return bfsqueue[end].t;
    }
    end++; //队尾后移
   }
  }
 }
 return -1;
}
int main()
{
 //freopen("1.txt","r",stdin);
 int i,j,k;
 char startend[10];
 while(cin>>startend)
 {
  cin>>N;
  for(i=0;i<N;++i)
   for(j=0;j<N;++j)
    for(k=0;k<N;++k)
     cin>>map[i][j][k];
  cin>>sz>>sy>>sx  //此处一定要注意读取的顺序
   >>ez>>ey>>ex;
  cin>>startend;
  //加入出发地
  bfsqueue[0].x = sx;
  bfsqueue[0].y = sy;
  bfsqueue[0].z = sz;
  bfsqueue[0].t = 0;
  map[0][0][0] = 'X';
  int min = BFS();
  if(min == -1)
   cout<<"NO ROUTE"<<endl;
  else
   cout<<N<<" "<<min<<endl;
 }
 return 0;
}

posted @ 2010-05-04 13:31  北海小龙  阅读(208)  评论(0编辑  收藏  举报