19.12.31QWQ和棋局挑战题解

nefuOJ1606
QWQ和棋局挑战题解

在一个 n ∗ n n* n nn大小的棋盘上放置 k k k个棋子,要求放置后的棋盘上每一行和每一列最多有一个棋子,求方案数,其中 0 < n < 9 , 0 < k < = n 00<n<9,0<k<=n
1.和八皇后问题不同,去掉了每条对角线上最多有一个棋子的限制.
2.(法I)考虑dfs.
dfs(y,cnt)表示当前考虑第y行,放置了cnt枚棋子
对于每一种状态,可以选择在第y行放置棋子,也可以选择不放.

void dfs(int y,int cnt)
{
     
    if(cnt==k){
     ans++;return;}
    if(y==n+1)return;
    for(int i=1;i<=n;i++)
    {
     
        if(vis[i]==0)
        {
     
            vis[i]=1;
            dfs(y+1,cnt+1);
            vis[i]=0;
        }
    }
    dfs(y+1,cnt);
}

3.(法II)排列组合
先考虑k严格小于n的情况.若逐行考虑,棋盘中一定含有 n − k n-k nk个空行.
先把k枚棋子放进k行n列的棋盘, N 1 = n ∗ ( n − 1 ) ∗ . . . ( n − k + 1 ) = A n k N1=n*(n-1)*...(n-k+1)=A_n^k N1=n(n1)...(nk+1)=Ank,(此处亦可以用深搜实现)
再把k行棋盘放进n行棋盘中, N 2 = C n k N2=C_n^k N2=Cnk.
由分步乘法计数原理, a n s = N 1 ∗ N 2 ans=N1*N2 ans=N1N2.
特别地,当 n = k n=k n=k时, a n s = n ! ans=n! ans=n!,亦符合上式.

你可能感兴趣的:(19.12.31QWQ和棋局挑战题解)