LeetCode链接
一、问题描述
你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同)。
给你网格图的行数 n 。
请你返回给 grid 涂色的方案数。由于答案可能会非常大,请你返回答案对 10^9 + 7 取余的结果。
示例1:
示例2:
二、问题分析
这是一个组合 问题,一般思路都是分情况讨论:
首先网格的列数是固定的,所以以列分情况讨论;而行之间约束我们可以发现,当前行的方案只与上一行的方案有关,例如第一行的方案确定后, 第二行会根据第一行满足行约束,满足后,第三行也只会根据已经满足好第一行的第二行再满足行约束。
分为两种情况:
- 第一块和第三块颜色相同
- 第一块和第三块颜色不同
1. 上一行是第一种情况
当前行第一种情况的方案数为 3
种:
1)若当前行第一,三块颜色与上一行第二块颜色相同,此时当前行第二块颜色有 2 种方案
2)若当前行第一,三块颜色与上一行第二块颜色不同,此时当前行第二块颜色只有 1 种方案
当前行第二种情况的方案数为 2
种:
1)若当前行第一块颜色与上一行第二块颜色相同,可知上一行第一块的颜色只能出现在当前行的第二块,所以只有 1 种方案
2)若当前行第一块颜色与上一行第二块颜色不同,可知上一行第一块的颜色只能也出现在当前行的第二块,所以 1 种方案
2. 上一行是第二种情况
当前行第一种情况的方案数为 2
种:
1)可知当前行第一,三块颜色只能与上一行第二块颜色相同,而当前行第二块颜色有 2 种方案
当前行第二种情况的方案数为 2
种:
1)若当前行第一块颜色与上一行第二块颜色相同,可知只有 1 种方案
2)若当前行第一块颜色与上一行第二块颜色不同,可知也只有 1 种方案
通过上图这样的迭代关系就能求出最终的方案数。
三、代码(Python)
class Solution:
def numOfWays(self, n: int) -> int:
preSame, preDiff = 6, 6 # 上一层两种情况的方案数
curSame, curDiff = 6, 6 # 当前层两种情况的方案数
for i in range(2, n+1):
curSame = preSame*3+preDiff*2
curDiff = preSame*2+preDiff*2
preDiff, preSame = curDiff, curSame
return (curDiff+curSame)%(10**9+7)