BFS求最短距离模板

链接:https://ac.nowcoder.com/acm/contest/5338/A
来源:牛客网
Nancy喜欢吃果冻!  
Nancy钻进了一个n×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。   
但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。 
Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。 下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭
第一行:一个整数n。
接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:1≤n≤1001 \leq n \leq 1001n100,保证果冻(1,1,1)不是Nancy不愿意吃的。
 
 
由题目可知这道题是三维BFS
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=0;
int dz[6]={1,-1,0,0,0,0};
int dx[6]={0,0,0,0,1,-1};
int dy[6]={0,0,-1,1,0,0};
char Map[120][120][120];//x,y,z
bool vis[120][120][120];
class Node
{
    public: 
        int z;
        int x;
        int y;
        int val;
        Node(int a,int b,int c,int d)
        {
            z=a;
            x=b;
            y=c;
            val=d;
       
        }
};
int Bfs(int z,int x,int y)
{
    queue<Node> p;
    int f1=0;
    vis[z][x][y]=1;
    Node a(z,x,y,1);
    p.push(a);
    while(!p.empty())
    {
        if(f1) break;
        Node temp=p.front();
        p.pop();
        for(int i=0;i<6;i++)
        {
            int iz=temp.z+dz[i];
            int ix=temp.x+dx[i];
            int iy=temp.y+dy[i];
            int ival=temp.val+1;
            if(iz>=1&&iz<=n&&ix>=0&&ix<=n&&iy>=0&&iy<=n&&!vis[iz][ix][iy]&&Map[iz][ix][iy]=='.')
            {
                if(iz==n&&ix==n&&iy==n) f1=ival;
                Node h(iz,ix,iy,ival);
                p.push(h);
                vis[iz][ix][iy]=1;
                
            }
        }
    }
    return f1;
}
int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)
            {
                cin>>Map[i][j][k];

            }
 
        }
    }
    ans=Bfs(1,1,1);
    if(vis[n][n][n]) cout<<ans<<endl;
    else cout<<"-1"<<endl;
   
    
}

 

posted @ 2020-04-22 15:55  ___Charles  阅读(285)  评论(0)    收藏  举报