Description
Input
Output
Sample Input
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
Sample Output
1 0 3 4 NO ROUTE
题目大意:
X代表墙,不能走,如果可以走出来,输出步数,否则,输出“NO ROUTE”。
解题思路:
三维BFS,把跳跃看成是三维坐标Z的上下跳动。
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#define N 15
using namespace std;
struct node{
    int i,j,k;
    node(int i0=0,int j0=0,int k0=0){
        i=i0;j=j0;k=k0;
    }
};
int directionJ[6]={1,0,-1, 0,0, 0},ie,je,ke;
int directionI[6]={0,1, 0,-1,0, 0},step[N][N][N];
int directionK[6]={0,0, 0, 0,1,-1},n;
bool ans;
string str[N*N][N];
queue <node> path;
void bfs(node s){
    if(s.i==ie&&s.j==je&&s.k==ke) {ans=true;return;}
    for(int i=0;i<6;i++){
        int di=s.i+directionI[i],dj=s.j+directionJ[i],dk=s.k+directionK[i];
        if(di>=0&&di<n&&dj>=0&&dj<n&&dk>=0&&dk<n){
            if(str[dk][di][dj]!='X'&&step[dk][di][dj]==-1){
                path.push(node(di,dj,dk));
                step[dk][di][dj]=step[s.k][s.i][s.j]+1;
            }
        }
    }
    if(!path.empty())  path.pop();
    if(path.empty())  return;
    bfs(path.front());
}
int main(){
    char tmpstr[10];
    while(scanf("%s%d",tmpstr,&n)!=EOF){
        int is,js,ks;
        ans=false;
        memset(step,-1,sizeof(step));
        while(!path.empty()) path.pop();
        for(int k=0;k<n;k++){
            for(int i=0;i<n;i++){
                    cin>>str[k][i];
            }
        }
        scanf("%d%d%d%d%d%d\n%s",&is,&js,&ks,&ie,&je,&ke,tmpstr);
        path.push(node(is,js,ks));
        step[ks][is][js]=0;
        bfs(path.front());
        if(!ans) printf("NO ROUTE\n");
        else printf("%d %d\n",n,step[ke][ie][je]);
    }
    return 0;
}
原文地址:http://blog.csdn.net/hush_lei/article/details/38846725