立方体(周赛题)

给定一个 k \times n \times m 的长方体,即它共有 k 层,每层都由 n \times m个 1 \times 1 \times 1的小立方体组成。

层从高到低依次编号为1\sim k,每一层的行从上到下依次编号为 1 \sim n,每一层的列从左到右依次编号为 1 \sim m

第 i 层第 j 行第 q 列的小立方体表示为 \left(i,j,q \right )

每个小立方体,要么是空的(用 . 表示),要么包含障碍物(用 # 表示)。

初始时,你位于\left(1,x,y \right ),保证该立方体是空的。

当你位于一个空立方体时,你可以沿前后上下左右六个方向自由移动至相邻立方体中,但是不能移动至长方体外,也不能移动至有障碍物的立方体中。

请你计算,你最多可以到达多少个空立方体?

注意,计数时初始立方体也要计算在内,同一立方体可以进入多次。

输入格式

第一行包含三个整数 k,n,m

随后包含 k 个 n 行 m 列的字符矩阵,其中第 i 个字符矩阵中的第 j 行第 q 列的字符表示立方体 \left(i,j,q \right ) 的具体状态,如果为 . 则表示该立方体是空的,如果为 # 则表示该立方体包含障碍物。

每个字符矩阵的上方和下方都有且仅有一个空行,用来将矩阵隔开(具体可参照样例)。

最后一行包含两个整数 x,y,你的初始位置即为 \left(1,x,y \right )

输出格式

一个整数,表示最多可以到达的空立方体数量。

数据范围

前 55 个测试点满足 1 \leqslant k,n,m \leqslant 3
所有测试点满足 1 \leqslant k,n,m \leqslant 10, 1 \leqslant x \leqslant n , 1 \leqslant y \leqslant m

输入样例:

1 1 1

.

1 1

输出样例:

1

代码如下

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 15;
bool flag[N][N][N];
char g[N][N][N];
struct point{
    int x,y,z;
    point(){}
    point(int a,int b,int c){
        x = a,y = b,z = c;
    }
};


int dx[] = {1,0,-1,0,0,0},dy[] = {0,1,0,-1,0,0},dz[] = {0,0,0,0,1,-1};
queue<point> q;

int k,n,m;
int x,y;

int main(){
    cin >> k >> n >> m;
    for(int i = 1;i <= k;i ++){
        for(int j = 1;j <= n;j++){
            for(int l = 1;l <= m;l ++){
                cin >> g[i][j][l];
            }
        }
    }
    cin >> x >> y;
    flag[1][x][y] = true;
    q.push(point(1,x,y));
    int res = 1;
    while(!q.empty()){
        auto t = q.front();
        q.pop();
        for(int i = 0;i < 6;i++){
            int a,b,c;
            a = t.y + dx[i],b = t.z + dy[i],c = t.x + dz[i];
            if(!flag[c][a][b] && a >= 1 &&  a <= n && b >= 1 && b <= m && c >= 1 && c <= k && g[c][a][b] == '.'){
                q.push(point(c,a,b));
                res ++;
                flag[c][a][b] = true;
            }
        }
    }
    cout << res << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值