给定一个 的长方体,即它共有 层,每层都由 个 的小立方体组成。
层从高到低依次编号为,每一层的行从上到下依次编号为 ,每一层的列从左到右依次编号为 。
第 层第 行第 列的小立方体表示为 。
每个小立方体,要么是空的(用 .
表示),要么包含障碍物(用 #
表示)。
初始时,你位于,保证该立方体是空的。
当你位于一个空立方体时,你可以沿前后上下左右六个方向自由移动至相邻立方体中,但是不能移动至长方体外,也不能移动至有障碍物的立方体中。
请你计算,你最多可以到达多少个空立方体?
注意,计数时初始立方体也要计算在内,同一立方体可以进入多次。
输入格式
第一行包含三个整数 。
随后包含 个 行 列的字符矩阵,其中第 个字符矩阵中的第 行第 列的字符表示立方体 的具体状态,如果为 .
则表示该立方体是空的,如果为 #
则表示该立方体包含障碍物。
每个字符矩阵的上方和下方都有且仅有一个空行,用来将矩阵隔开(具体可参照样例)。
最后一行包含两个整数 ,你的初始位置即为 。
输出格式
一个整数,表示最多可以到达的空立方体数量。
数据范围
前 55 个测试点满足 。
所有测试点满足 。
输入样例:
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;
}