列表

详情


NC15694. 幻方

描述

Cwbc制作了一个神奇的幻方,他想给XHRlyb一个惊喜。
幻方是一个正方体。在这个幻方的表面,有若干个激光发射器,其发射出的激光可以无视任何障碍地沿直线穿过幻方。与众不同的,其上下面的激光是绿色,前后面的激光是蓝色,左右面的激光是红色。
XHRlyb一个方块是美观的,当且仅当这个格子被三种不同颜色的激光同时穿过(可以对照样例理解题目大意)。
请你计算出有多少个方块是美观的。
XHRlyb站在幻方的内部,看着四周没有被点亮的激光发射器,心中产生了一个美好的幻想——聪明、智慧又帅气的Cwbc到底会给她一个什么样的惊喜呢?
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述

有多组数据,对于每组数据,格式为:
第一行,输入一个整数N。
接下来描述长方体不同面上的情况,字符#表示在这个表面上有一个激光发射器,字符.表示没有。
接下来N行,每行N个字符,表示从内部看正面的情况。
接下来N行,每行N个字符,表示从内部看背面的情况。
接下来N行,每行N个字符,表示从内部看左侧面的情况。
接下来N行,每行N个字符,表示从内部看右侧面的情况。
接下来N行,每行N个字符,表示从内部看顶面的情况。
接下来N行,每行N个字符,表示从内部看底面的情况。

输出描述

对于每组数据,输出一个整数表示美观的方块的个数。

示例1

输入:

5
.####
#.###
##.##
###.#
####.
.####
#.###
##.##
###.#
####.
.####
#.###
##.##
###.#
####.
.####
#.###
##.##
###.#
####.
.####
#.###
##.##
###.#
####.
.####
#.###
##.##
###.#
####.

输出:

112

说明:

如图所示,每个面中心的方块和体心方块不是美观的。
这组图片是展示从内部观察时的情景,黑色部分为没有激光发射器,白色部分有激光发射器。

其中图1是从顶部看内部时的情景,图2是从某一棱看内部时的情景。
(注意,图2中,XHRlyb面向了图中左侧的侧面墙壁)

示例2

输入:

3
.##
#.#
##.
.##
#.#
##.
.##
#.#
##.
.##
#.#
##.
.##
#.#
##.
.##
#.#
##.

输出:

20

说明:

如图所示,每个面中心的方块和体心方块不是美观的。
这张图片是展示从外部观察时的情景。

这张图片是其展开图,其中白色表示一个激光发射器。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 329ms, 内存消耗: 25748K, 提交时间: 2023-01-10 15:43:16

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
#define N 205
#define Mod 2000120420010122
//#include<bits/stdc++.h>
char a[N][N][N];
char b[N][N][N];
char c[N][N][N];
char t[N][N];
int main() {
	int n;
	while (cin >> n) {
    
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		memset(c, 0, sizeof(c));
		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						a[i][n-1-j][k] = 1;

		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						a[i][j][k] = 1;
		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						b[i][k][j] = 1;
		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						b[i][k][n-1-j] = 1;
		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						c[k][j][i] = 1;

		for (int i = 0; i < n; i++) {
			scanf("%s", t[i]);
		}
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (t[i][j] == '#')
					for (int k = 0; k < n; k++)
						c[k][j][n-1-i] = 1;
		int ans = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				for (int k = 0; k < n; k++) {
					ans += a[i][j][k] * b[i][j][k] * c[i][j][k];
				
				}
			}
		}
        	cout << ans << endl;
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 149ms, 内存消耗: 1364K, 提交时间: 2020-08-28 11:33:33

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 205;
char a[7][maxn][maxn];
int N, ans;
int main() {
    while(~scanf("%d", &N)) {
        ans = 0;
        for(int i = 0; i < 6; i++) {
            for(int j = 1; j <= N; j++) scanf("%s", a[i][j] + 1);
        }
        for(int k = 1; k <= N; k++) {
            for(int j = 1; j <= N; j++) {
                for(int i = 1; i <= N; i++) {
                    ans += ('#' == a[0][k][N + 1 - j] || '#' == a[1][k][j]) && ('#' == a[2][k][N + 1 - i] || '#' == a[3][k][i]) && 
                        ('#' == a[4][N + 1 - i][j] || '#' == a[5][i][j]);
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

上一题