广搜(这个写的最好啦)

#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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值