CF60B Serial Time! 解题报告
1 题目链接
http://codeforces.com/problemset/problem/60/B
2 题目整理
题目 :连续剧时间!
题目描述
锡里尔的朋友们喜欢看电视连续剧剧。一集就要开始了,他还没有洗盘子。但他决定至少在水龙头下放满水。板可以用一个平行六面体k ?×? n ?×? m表示,即它有k层(第一层是上一层),每一层都是一个长方形n ?×? m,有空方格(’.’)和障碍物(’#’)。水只能出现在空旷的方格中。抽头位于正方形上方( x ,? y )第一层,保证这个方格是空的。每分钟就有一个立方单位的水落入盘子。找出连环男演员应该在多少分钟内将自己从肥皂剧中解脱出来,然后关掉水,以免盘子溢出。也就是说,您应该找到盘子绝对装满并且下一刻将被装满的时刻。
注意:水会填满触手可及的所有区域(参见示例 4)。水在 6 个方向中的每一个方向上流动,通过1 × 1 × 1立方体的面。
输入格式
第一行包含三个数字k、n、m,它们是板的尺寸。然后沿着由n行组成的k个矩形,每行包含m个字符’或者“#”,它代表盘子的“层”,顺序是从上到下。矩形之间用空线隔开(参见示例)。最后一行包含抽头的坐标x和y。x是行的编号,y是列的编号。每层的行从左到右用1到n的整数编号,每层的列从上到下用1到m的整数编号。
输出格式
答案应该包含一个数字,显示盘子将在多少分钟内填满。
样例输入1
1 1 1.1 1
样例输出1
1
样例输入2
2 1 1.#1 1
样例输出2
1
样例输入3
2 2 2.#
##..
..1 1
样例输出3
5
样例输入4
3 2 2#.
###.
.#..
..1 2
样例输出4
7
样例输入5
3 3 3.#.
###
##..##
###
##....
...
...1 1
样例输出5
13
数据范围
对于 100 % 100\% 100%的数据:
1 ≤ n , m , k ≤ 10 1 \le n, m,k \le 10 1≤n,m,k≤10
1 ≤ x ≤ n 1 \le x \le n 1≤x≤n
1 ≤ y ≤ m 1 \le y \le m 1≤y≤m
3 题意分析
3.1 题目大意
给定一个三维空间,问(x, y, 1)所在的联通块有多少个小单元格?
3.2 样例分析
如上所述。
4 解法分析
这道题,其实和走迷宫问题很像,只不过是把地图升级成了三维的而已。此题深搜广搜都能做。
深搜就是把可能的路径都试一遍,发现到了一个没走过的格子就把答案+1,时间复杂度会比较高(但这题范围小,
能过)。
广搜每一次都扩展一些点,如果扩展的点不能走或者走过了,就不走;否则加进队列,答案+1,时间复杂度O(nm
k),肯定能过。
AC代码
ACCode #001
// From Heart_Blue
// Rating 2425
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MEM(a,b) memset((a),(b),sizeof(a))
const LL INF = 1e9 + 7;
const int N = 2e2 + 10;
char board[N][N][N];
int flag[N][N][N];
int dx[] = {
0,0,0,0,1,-1 };
int dy[] = {
0,0,1,-1,0,0 };
int dz[] = {
1,-1,0,0,0,0 };
int k, n, m;
int ans = 0;
void dfs(int x, int y, int z)
{
if (x < 0 || x == k) return;if (y < 0 || y == n) return;if (z < 0 || z == m) return;if (flag[x][y][z]) return;if (board[x][y][z] == '#') return;flag[x][y][z] = 1;ans++;for (int i = 0; i < 6; i++){
dfs(x + dx[i], y + dy[i], z + dz[i]);}
}
int main()
{
//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);cin >> k >> n >> m;for (int i = 0; i < k; i++){
for (int j = 0; j < n; j++){
cin >> board[i][j];}}int x, y;cin >> x >> y;dfs(0, x - 1, y - 1);cout << ans << endl;return 0;
}
ACCode #002
// From abdulla.ashraf
// Rating 1939
#include <bits/stdc++.h>using namespace std;typedef long long ll;int OO = 1000000000;char g[15][15][15];int n, m, k;int go(int x, int y, int z) {
if (x < 0 || y < 0 || z < 0 || x >= n || y >= m || z >= k|| g[x][y][z] == '#')return 0;g[x][y][z] = '#';int ret = 1;ret += go(x + 1, y, z);ret += go(x - 1, y, z);ret += go(x, y + 1, z);ret += go(x, y - 1, z);ret += go(x, y, z + 1);ret += go(x, y, z - 1);return ret;
}int main() {
int x, y;cin >> k >> n >> m;for (int i = 0; i < k; i++)for (int j = 0; j < n; j++)for (int h = 0; h < m; h++)cin >> g[j][h][i];cin >> x >> y;cout << go(x-1,y-1,0);return 0;
}
ACCode #003
// From KieranHorgan
// Rating 2190
#include <bits/stdc++.h>#define ll long longusing namespace std;ll n, m, l, ans;
vector<int> a;
string s;
bool visited[11][11][11];int main() {
ios_base::sync_with_stdio(0);cin.tie(0);cin >> l >> n >> m;for(int i = 0; i < l; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < m; k++) {
char c;cin >> c;if(c=='#') visited[i][j][k] = 1;}}}int t1, t2;cin >> t1 >> t2;t1--;t2--;queue<pair<int,pair<int,int>>> q;q.push({
0,{
t1,t2}});while(!q.empty()) {
pair<int, pair<int, int>> u = q.front();q.pop();int x = u.second.first;int y = u.second.second;int z = u.first;
// cout << z << " " << x << " " << y << endl;if(x<0||x>=n || y<0||y>=m || z<0||z>=l || visited[z][x][y]) {
continue;}visited[z][x][y] = 1;ans++;q.push({
z+1,{
x,y}});q.push({
z-1,{
x,y}});q.push({
z,{
x+1,y}});q.push({
z,{
x-1,y}});q.push({
z,{
x,y+1}});q.push({
z,{
x,y-1}});}cout << ans << endl;
}