资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定N×N的棋盘,问有多少种放置N个车使他们不互相攻击的方案。
输入格式
一行一个整数,N。
输出格式
一行一个整数,表示方案数。
样例输入
3
样例输出
6
数据规模和约定
N<=20
一开始认为是八皇后问题的简化版,非常天真的用深搜去解决,结果被数据量给教育了。。。超时,只得了30分。
# 开发人:HGC
# 开发时间:2022-02-08 10:47
n = int(input())
tmap = [-1] * n
ans = 0
def dfs(step, row):
global tmap, ans
if step >= n:
ans += 1
return
for i in range(n):
if i not in tmap:
tmap[row] = i
dfs(step + 1, row + 1)
tmap[row] = -1
dfs(0, 0)
print(ans)
后面改用动态规划的思想,但是这个题的规律非常简单,称不上是动态规划题目,只能算是找规律
例如,题目中给出的3*3矩阵,当我们在第一行放置了一个车,这个车所在的行列就被排除在剩下两个车能放的空间之外了,剩下的问题相当于2*2矩阵放置两个车。而第一行有放置第一个车时有三个选择(1,1)(1,2)(1,3),所以如果用dp[i]表示i*i矩阵放置车的方法数,那么dp[3]=dp[2]*3=dp[1]*2*3=6。剩下就很简单了。
# 开发人:HGC
# 开发时间:2022-02-08 11:12
n=int(input())
dp=[0]*(n+1)
dp[1]=1
for i in range(2,n+1):
dp[i]=dp[i-1]*i
print(dp[n])