车的放置
问题描述 在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的) 输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
解析:从样例可以看出‘车’是被放在格子里面的,而不是点上。我们可以自由选择摆放车的个数,以达到最多的摆法。
解法:其实可以用概率论的方法解题 当棋盘为n * n 时,我们可以选择的棋子数为0 ~ n , 棋子数为0 这算一种 棋子数为i 可以摆法的种数: 在n行格子中选择i行进行摆放就是C(i,n) 然后在摆放i个棋子时,第一个棋子有n种选择(n个列可以选),第二个有n-1种选择…就是A(i,n)
写代码时公式可以化简为 下图 ;cal()就是A的计算函数
#include<stdio.h>
int n;
int sum = 0;
int cal(int x){
int factor=1,i;
for(i=n;i>n-x;i--){
factor*=i;
}
factor *= factor;
for(i=x;i>=1;i--){
factor/=i;
}
return factor;
}
int main(){
int i;
scanf("%d",&n);
sum=1 + n*n;
for(i=2;i<=n;i++){
sum+=cal(i);
}
printf("%d",sum);
return 0;
}
本题:车的放置
|