题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一个国际象棋的棋盘,棋盘的大小为 8×88×8,即由 88 行 88 列共 6464 个方格组成。棋盘上有美丽的图案,因此棋盘旋转后与原来的棋盘不一样。
小蓝有很多相同的纸片,每张纸片正好能覆盖棋盘的两个相邻方格。小蓝想用 3232 张纸片正好将棋盘完全覆盖,每张纸片都覆盖其中的两个方格。
小蓝发现,有很多种方案可以实现这样的覆盖。如果棋盘比较小,方案数相对容易计算,比如当棋盘是 2×22×2 时有两种方案,当棋盘是 4×44×4 时有 3636 种方案。但是小蓝算不出他自己的这个 8×88×8 的棋盘有多少种覆盖方案。
请帮小蓝算出对于这个 8×88×8 的棋盘总共有多少种覆盖方案。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
先把demo贴在这,有空再回来写题解吧,有些累
n=int(input())
dp=[[0 for i in range((1<<n)+10)]for i in range(n+2)]
t=[0 for i in range(1<<n)]
for i in range(1<<n):#预处理每个合法状态
mid=i
cnt = 0
vis=0
for j in range(n):
if (mid&1==1):
if (cnt%2):
vis=1
break
else:
cnt=0
else:
cnt+=1
mid=mid>>1
if (cnt%2):
continue
if (vis!=1):
t[i]=1
dp[0][0]=1
for i in range(1,n+1):
for j in range(1<<n):
for k in range(1<<n):
if ( j&k==0 and t[j|k]): #凑出的状态合法:1,横放的不能冲突,2,凑出的该列的结果不能出现连续的零
dp[i][j]+=dp[i-1][k]
print(dp[n][0])