标签:
START 1 O 0 0 0 0 0 0 END START 3 XXX XXX XXX OOO OOO OOO XXX XXX XXX 0 0 1 2 2 1 END START 5 OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO XXXXX XXXXX XXXXX XXXXX XXXXX OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO OOOOO 0 0 0 4 4 4 END
1 0 3 4 NO ROUTE
http://acm.hdu.edu.cn/showproblem.php?pid=1240
题意:输入n,代表n*n*n的区域,下面有n个n*n的矩阵,代表每一层的情况,接下来输入起点和终点的坐标,如 果存在最短路径,输出n和最短路径的长度,不存在输出“NO ROUTE”;
简单BFS。三维注意坐标的含义!!
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
char a[15][15][15];
bool vis[15][15][15];
int n;
char ch[10];
int ans;
int sx,sy,sz,ex,ey,ez;
int dir[6][3]= {0,1,0,
1,0,0,
-1,0,0,
0,-1,0,
0,0,1,
0,0,-1
};
struct node
{
int x,y,z,t;
};
bool OK(node no)
{
if(no.x<0||no.x>=n||no.y<0||no.y>=n||no.z<0||no.z>=n)
return false;
return true;
}
int BFS()
{
node now,next;
queue<node>q;
memset(vis,false,sizeof(vis));
vis[sz][sx][sy]=true;
now.x=sx;
now.y=sy;
now.z=sz;
now.t=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==ex&&now.y==ey&&now.z==ez)
{
return now.t;
}
//cout<<"********************"<<endl;
for(int i=0; i<6; i++)
{
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
next.z=now.z+dir[i][2];
//cout<<"x="<<next.x<<",y="<<next.y<<",z="<<next.z<<endl;
if(OK(next)&&!vis[next.z][next.x][next.y]&&a[next.z][next.x][next.y]!='X')
{
vis[next.z][next.x][next.y]=true;
next.t=now.t+1;
//cout<<"----------------------------x="<<next.x<<",y="<<next.y<<",z="<<next.z<<endl;
q.push(next);
}
}
}
return -1;
}
int main()
{
while(scanf("%s%d",ch,&n)!=EOF)
{
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<n; k++)
scanf("%c",&a[i][j][k]);
getchar();
}
}
cin>>sy>>sx>>sz;
cin>>ey>>ex>>ez;
cin>>ch;
ans=BFS();
if(ans!=-1)
cout<<n<<" "<<ans<<endl;
else
cout<<"NO ROUTE"<<endl;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/51868253