zoukankan      html  css  js  c++  java
  • 题解 CF60B 【Serial Time!】

    思路:暴力搜索


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

    众所周知,迷宫问题的基本搜索形式就是标记当前点已走过,然后从当前点向能够扩展到的点递归。二维迷宫就是(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;
    }
    
    
  • 相关阅读:
    团队冲刺2---个人工作总结八(6.1)
    团队冲刺2---个人工作总结七(5.31)
    opencv2 用imwrite 抽取并保存视频图像帧
    VMware 虚拟机CentOS 7 网路连接配置 无eth0简单解决办法
    个人总结
    人月神话阅读笔记03
    个人冲刺10
    人月神话阅读笔记02
    第十六周学习进度情况
    个人冲刺09
  • 原文地址:https://www.cnblogs.com/ahawzlc/p/13429481.html
Copyright © 2011-2022 走看看