📜  N级六角形中的彩色0数(1)

📅  最后修改于: 2023-12-03 15:03:20.516000             🧑  作者: Mango

N级六角形中的彩色0数

介绍:

在一个n级的六角形网格中,每个六角形可以是红色、蓝色或白色。我们定义一个颜色0数是指一个六角形周围6个六角形中恰好有0个与它相同的颜色。我们的任务是计算彩色0数(在所有六角形上的颜色0数之和),其中n的范围为2至100。

思路:

通过观察一个六角形及其周围六个六角形的颜色显然是一个有限的状态集合。于是可以基于动态规划算法实现。设f[i][j][0/1/2]表示第i行第j个位置颜色为红色/蓝色/白色的颜色0数,g[i][j][0/1/2]表示区域[i,j-1]的颜色为红色/蓝色/白色的颜色0数。

当一个六角形颜色为红色时,它的颜色0数为其周围六个六角形中不为红色的个数,而周围六个六角形的状态为g[i-1][j-1]、g[i-1][j]、f[i-1][j-1]、f[i][j-1]、f[i+1][j-1]、f[i+1][j]。因此f[i][j][0] = 6n - g[i-1][j-1][0] - g[i-1][j][0] - f[i-1][j-1][0] - f[i][j-1][0] - f[i+1][j-1][0] - f[i+1][j][0]。

当一个六角形颜色为蓝色或白色时,它的颜色0数为其周围六个六角形中不为蓝色或白色的个数,而周围六个六角形的状态为g[i-1][j-1]、g[i-1][j]、g[i][j+1]、g[i+1][j+1]、g[i+1][j]、f[i][j+1]、f[i][j-1]。因此f[i][j][1/2] = 6n - g[i-1][j-1][1/2] - g[i-1][j][1/2] - g[i][j+1][1/2] - g[i+1][j+1][1/2] - g[i+1][j][1/2] - f[i][j+1][1/2] - f[i][j-1][1/2]。

最终答案为所有六角形的颜色0数之和,即sum(f[n][j][0]+f[n][j][1]+f[n][j][2]),其中j从1到n。

代码:

n = int(input())
f = [[[0] * 3 for _ in range(n+2)] for __ in range(n+1)]
g = [[[0] * 3 for _ in range(n+2)] for __ in range(n+1)]
for i in range(1, n+1):
    for j in range(1, i+1):
        s = input().rstrip().lower()
        if s == 'r':
            f[i][j][0] = 6*n - g[i-1][j-1][0] - g[i-1][j][0] - f[i-1][j-1][0] - f[i][j-1][0] - f[i+1][j-1][0] - f[i+1][j][0]
        else:
            f[i][j][1] = 6*n - g[i-1][j-1][1] - g[i-1][j][1] - g[i][j+1][1] - g[i+1][j+1][1] - g[i+1][j][1] - f[i][j+1][1] - f[i][j-1][1]
            if s == 'w':
                f[i][j][2] = f[i][j][0]
        g[i][j] = [f[i][j][0], f[i][j][1], f[i][j][2]]
ans = 0
for j in range(1, n+1):
    ans += f[n][j][0] + f[n][j][1] + f[n][j][2]
print(ans)

代码片段如上。