题解 CF60B 【Serial Time!】

思路:暴力搜索


就和大多数迷宫类问题相似,只不过这个是三维的。

众所周知,迷宫问题的基本搜索形式就是标记当前点已走过,然后从当前点向能够扩展到的点递归。二维迷宫就是\(dfs(x\pm1,y),dfs(x,y\pm1)\),三维就在原来基础上加上\(z\),也就是\(dfs(x\pm1,y,z),dfs(x,y\pm1,z),dfs(x,y,z\pm1)\)。递归边界显然,就是不出地图和能走动。

为了方便,我们提前预处理出走的这六步,也就是下面代码中的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;
}

posted @ 2020-08-03 21:04  ahawzlc  阅读(126)  评论(0编辑  收藏  举报