题目描述
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
思路分析
首先想到数学算法,利用排列组合:
先定棋子数量0,1,...,n,记为i
选定i个行,C(n,i)
列摆放方法:n x (n-1) x ... x (n-i+1)
结果 = C(n,i)* n x (n-1) x ... x (n-i+1)
关键函数
def main():
n = int(input().rstrip())
res = 0
for i in range(n+1):
k = 1
for j in range(i):
k *= n - j
res += C(n, i) * k
print(res)
完整代码
# 试题 算法训练 车的放置
import math
C = math.comb
def main():
n = int(input().rstrip())
res = 0
for i in range(n+1):
k = 1
for j in range(i):
k *= n - j
res += C(n, i) * k
print(res)
if __name__ == "__main__":
main()
运行结果
请读者合理引用,转载文章内容,部分内容参考自网络,如有侵权联系删除