思路:暴力搜索
就和大多数迷宫类问题相似,只不过这个是三维的。
众所周知,迷宫问题的基本搜索形式就是标记当前点已走过,然后从当前点向能够扩展到的点递归。二维迷宫就是(dfs(xpm1,y),dfs(x,ypm1)),三维就在原来基础上加上(z),也就是(dfs(xpm1,y,z),dfs(x,ypm1,z),dfs(x,y,zpm1))。递归边界显然,就是不出地图和能走动。
为了方便,我们提前预处理出走的这六步,也就是下面代码中的dx[],dy[],dz[]
。
Coding Time
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=15;
const int dx[7]={0,1,-1,0,0,0,0},dy[7]={0,0,0,1,-1,0,0},dz[7]={0,0,0,0,0,1,-1};//预处理出走的方向
char ch[N][N][N];
bool vis[N][N][N];
int n,m,k,u,v,t;
bool check(int x,int y,int z) {
if(x<1||x>n||y<1||y>m||z<1||z>k) return 0;//超出边界
if(vis[x][y][z]||ch[x][y][z]-'.') return 0;//此路不通
//ch[x][y][z]-'.'等同于ch[x][y][z]!='.'
return 1;
}
void dfs(int x,int y,int z) {
++t;//统计答案
vis[x][y][z]=1;//标记走过
for(int i=1;i<=6;i++) {
int xx=x+dx[i],yy=y+dy[i],zz=z+dz[i];//走一步
if(check(xx,yy,zz)) dfs(xx,yy,zz);//可行的话搜索下一层
}
return;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);//读入优化
cin>>k>>n>>m;
for(int l=1;l<=k;l++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ch[i][j][l];//读入地图
cin>>u>>v;
dfs(u,v,1);//开始搜索
cout<<t;
return 0;
}