《魔方大厦》是描述来克因魔方打乱后拼不回去,将魔方怒而掷地,魔方却突然变大,好奇的来克便进入到魔方世界里的一个故事。 C6H8O6 看了这部诡异的动画片后,晚上做梦也来到了魔方大厦中,魔方大厦是一个 n×n×n 的三维立方体,总共由 n3 个小立方体组成,每个立方体是一个“有趣”的国家。C6H8O6 在这些国家里开始了一系列神奇的历险。 所有小立方体按照坐标 (xi,yi,zi) 的字典序编号 1 至 n3 ,第 i 个立方体国家的惊悚程度是 fi 。C6H8O6 希望在魔法大厦里展开一次惊悚旅行。 在每个小立方体上,C6H8O6 只能前往相邻且更加惊悚的小立方体。即设 C6H8O6 当前处在的小立方体是 i 号,他能够前往的立方体 j 需要满足的条件是: 1. ∣xi−xj∣+∣yi−yj∣+∣zi−zj∣=1 ; 2. fi<fj 。 C6H8O6 可以任选起点展开旅行,求旅行的方案总数对 p 取模的余数。只要经过小立方体的编号和顺序存在区别,就认为两种方案是不同的。
从标准输入读入数据。 第一行输入一个正整数 n (n≤200)。 第二行输入 n3 个正整数 ( ),表示编号为 的立方体的惊悚程度。 第三行输入一个正整数 fi ( fi≤109 )。 ## 输出格式 输出到标准输出。 输出一个整数,代表方案总数对 p 取模的余数。
2 1 2 3 4 5 6 7 8 99
38
以 1 至 8 号小立方体为起点的旅行方案数目分别为 16,5,5,2,5,2,2,1 。
//算法:搜索
//时间复杂度:θ(n^3)
//空间复杂度:θ(n^3)
#include <bits/stdc++.h>
#define endl "\n"
#define uns unsigned
using namespace std;
int n, f[201][201][201], p, tp[201][201][201];
uns ans;
const int dx[] = {-1, 1, 0, 0, 0, 0};
const int dy[] = {0, 0, -1, 1, 0, 0};
const int dz[] = {0, 0, 0, 0, -1, 1};
int dfs(int, int, int);
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++) {
cin >> f[i][j][k];
}
}
}
cin >> p;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++) {
(ans += dfs(i, j, k)) %= p;
}
}
}
cout << ans;
return 0;
}
int dfs(int x, int y, int z)
{
if (tp[x][y][z]) {
return tp[x][y][z];
}
int tot = 1;
for (int i = 0; i < 6; i++) {
int nx = x + dx[i], ny = y + dy[i], nz = z + dz[i];
if (nx < 1 || nx > n || ny < 1 || ny > n || nz < 1 || nz > n) {
continue;
}
if (f[x][y][z] >= f[nx][ny][nz]) {
continue;
}
tot += dfs(nx, ny, nz);
}
return tp[x][y][z] = tot;
}
求大佬 QwQ Orz