三维广搜 PKU2225||ZJU1438

来源:互联网 发布:dhcp服务器软件下载 编辑:程序博客网 时间:2024/05/08 00:43
//注意输入的是列、行、层。//HDU1240#include#include#include#include#include#include#includeusing namespace std;#define inf 10000000char map[11][11][11];int n;int dir[6][3]={{0,0,1},{0,0,-1},{0,-1,0},{0,1,0},{1,0,0},{-1,0,0}};int fx[6]={1,-1,0,0,0,0},fy[6]={0,0,1,-1,0,0},fz[6]={0,0,0,0,-1,1};int visit[11][11][11];struct node{   int x,y,z,step;};int pd(int x,int y,int z){   if(x>=0&&x=0&&y=0&&z        &&visit[x][y][z]==0&&map[x][y][z]=='O')         return 1;     return 0; }int bfs(int a,int b,int c,int d,int e,int f)//广度优先搜索{        int dx,dy,dz,i;  queueq;  memset(visit,0,sizeof(visit));        node front,rear;        front.x=a,front.y=b,front.z=c,front.step=0;        q.push(front);        visit[a][b][c]=1;  if(a==d&&b==e&&c==f)  {      return front.step;  }        while(!q.empty())//判断队列是否为空       {               front=q.front();//队首元素出队              q.pop();              for(i=0;i<6;i++)              {                   dx=front.x+dir[i][0];       dy=front.y+dir[i][1];       dz=front.z +dir[i][2];                   if(pd(dx,dy,dz))//判断是否在图中且有无访问过                   {                            visit[dx][dy][dz]=1;//标记当前点已访问过                            if(dx==d&&dy==e&&dz==f)//判断当前点是否为终点       {                                     return front.step+1;       }                            rear.x=dx,rear.y=dy,rear.z=dz,rear.step=front.step+1;//步数为父节点(起始点)步数加1                            q.push(rear);                  }              }      }  return -1;}int main(){ char s1[10],s2[10]; int a,b,c,d,e,f; while(~scanf("%s%d",s1,&n)) {   int i,j,k;   for(i=0;i    for(j=0;j     for(k=0;k     cin>>map[i][j][k];   scanf("%d%d%d",&a,&b,&c);   scanf("%d%d%d",&d,&e,&f);   scanf("%s",s2);   map[d][e][f]='O';   int ans=bfs(c,b,a,f,e,d);//注意输入转换;   if(ans!=-1)    printf("%d %d\n",n,ans);   else    printf("NO ROUTE\n"); }return 0;}

原创粉丝点击