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