NC15694. 幻方
描述
输入描述
有多组数据,对于每组数据,格式为:
第一行,输入一个整数N。
接下来描述长方体不同面上的情况,字符#表示在这个表面上有一个激光发射器,字符.表示没有。
接下来N行,每行N个字符,表示从内部看正面的情况。
接下来N行,每行N个字符,表示从内部看背面的情况。
接下来N行,每行N个字符,表示从内部看左侧面的情况。
接下来N行,每行N个字符,表示从内部看右侧面的情况。
接下来N行,每行N个字符,表示从内部看顶面的情况。
接下来N行,每行N个字符,表示从内部看底面的情况。
输出描述
对于每组数据,输出一个整数表示美观的方块的个数。
示例1
输入:
5 .#### #.### ##.## ###.# ####. .#### #.### ##.## ###.# ####. .#### #.### ##.## ###.# ####. .#### #.### ##.## ###.# ####. .#### #.### ##.## ###.# ####. .#### #.### ##.## ###.# ####.
输出:
112
说明:
如图所示,每个面中心的方块和体心方块不是美观的。示例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; }