#include<iostream>
#include<stdio.h>
#include<string>
#include<queue>
using namespace std;
#define MAX 13
int n;char start[10];char end[10];
int i,j,k;char map[MAX][MAX][MAX];
int dist[MAX][MAX][MAX];int visited[MAX][MAX][MAX];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
class Point
{
public :
int x;
int y;
int z;
};
Point st,et;
int over(Point p)
{
if(p.x<0 ||p.y<0 ||p.z<0) return 1;
if(p.x>=n||p.y>=n||p.z>=n) return 1;
else return 0;
}
void bfs()
{
queue<Point>q;
q.push(st);
visited[st.x][st.y][st.z]=1;
dist[st.x][st.y][st.z]=0;
while(!q.empty())
{
Point p=q.front();q.pop();Point cs;
if(p.x==et.x&&p.y==et.y&&p.z==et.z)
return;
for(i=0;i<6;i++)
{
cs.x=p.x;cs.y=p.y;cs.z=p.z;
cs.x+=dir[i][0];cs.y+=dir[i][1];cs.z+=dir[i][2];
if(!over(cs)&&!visited[cs.x][cs.y][cs.z]&&map[cs.x][cs.y][cs.z]=='O')
{
visited[cs.x][cs.y][cs.z]=1;
q.push(cs);
dist[cs.x][cs.y][cs.z]=dist[p.x][p.y][p.z]+1;
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%s %d",start,&n)==2)
{
//初始化
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
for(k=0;k<MAX;k++)
{
visited[i][j][k]=0;
map[i][j][k]=0;
dist[i][j][k]=-1;
}
}
}
getchar();//吃掉回车
char temp[MAX];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
gets(temp);
for(k=0;k<n;k++)
{
map[k][j][i]=temp[k];
}
}
}
scanf("%d %d %d",&st.x,&st.y,&st.z);getchar();
scanf("%d %d %d",&et.x,&et.y,&et.z);getchar();
scanf("%s",end);getchar();
bfs();
if(dist[et.x][et.y][et.z]==-1)
cout<<"NO ROUTE"<<endl;
else
{
cout<<n<<" "<<dist[et.x][et.y][et.z]<<endl;
}
}
return 0;
}
/*
1 笛卡尔坐标系中x,y,z。但是在数组当中先存储的是最后一个,让后是前一个让后是最前一个
也就是说map[z][y][x];列填满加一行,行添满,加一层。
2 结束的条件是到达et 而不是nnn;
所以if(p.col==et.col&&p.lay==et.lay&&p.row==et.row)
return
3 改变存储的方式,可以使xyz一个一个的列出来。
*/
题目翻译
输入
这个问题的输入包裹一系列最高100个数据集合。每一个数据集合将会拥有下面描述的格式,并且在数据集合之间没有空白行。
一个数据集合有5个元素:
开始行只有一行。“START N”其中1<=N<=10.
片列——N片。每一片是一个N*N的矩阵。这个矩阵表现啦穿过小行星区域地面的片。这个矩阵中的每一个点将有两个值,
‘O’——空空间
‘X’——小行星
开始位置——只有一行。“A B C”起始位置。中键有一个空格。
目标位置——只有一行。“D E F”目标位置。中间有一个空格。
结束线——单行线。“END”
第一个参数表示列,左为0;
第二个参数表示行,顶为0;
第三个参数表示层,第一层为0;
输出
对于每一个数据集合,将有一个输出结合,各个输出集合之间没有空格。
一个输出集合一行。如果存在一条路径。输出“X Y”,X就是输入的N。Y代表最小的移动数目。从起点到终点。如果没有路径从开始点到结束的电,那么这一行就用“NO ROUTE”代替。
一个一下哦那个智能有六个方向,上下左右前后。也就是说,每一次只能够改变一个坐标位置,而且智能改变1.
广搜(这个写的最好啦)
最新推荐文章于 2024-01-22 12:04:38 发布