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;
    }
    
    
  • 相关阅读:
    c++之单链表
    c++之变量的生存期及可见性
    c++之结构体-结构数组排序
    c++之递归函数
    c++之指针练习
    C++之面向对象之构造函数和拷贝构造方法,以及析构方法
    C++之命名空间
    C++之面向对象之对象的使用
    Hadoop RPC实现
    BP(商业计划书写)
  • 原文地址:https://www.cnblogs.com/ahawzlc/p/13429481.html
Copyright © 2011-2022 走看看