【题目】
1377: 象棋中的车
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 188 Solved: 76
[Submit][Status][Web Board]
Description
在一个n*n的棋盘中放置k个车,使得这k个车互相不攻击,一共有多少种放法(两车互相不攻击的条件为两车不在同一行且不在同一列)。
Input
多组测试数据,每组测试数据包含两个正整数n,k(1<=n<=10,1<=k<=n*n)。
Output
对于每组测试数据输出一个整数代表一共有几种放法。
Sample Input
4 4
Sample Output
24
【分析】
当k>n,答案明显为0;
当k<=n,因为车不可以同行,所以至少需要k行才可以放下,记下部分答案C(n,k)
又因为必须不同列所以还有部分答案为n!/(n-k)!
最后相乘就是答案了
【代码】
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int i;
if(n<k)
printf("0\n");
else
{
int ans=1,t1=1,t2=1;
if(n!=k)
{
for(i=n;i>n-k;i--)
t1*=i;
for(i=k;i>0;i--)
t2*=i;
t1/=t2;
}
for(i=n;i>n-k;i--)
ans*=i;
ans*=t1;
printf("%d\n",ans);
}
}
return 0;
}
就算TLE我也想挂上来,证明他存在过...因为我一直对搜索莫名畏惧...打扰了
#include<bits/stdc++.h>
using namespace std;
int a[12][12],ans,n,k;
int nodanger(int c,int num)
{
int i,f=1;
for(i=0;i<num;i++)
if(a[i][c])
f=0;
return f;
}
void dfs(int r,int num)
{
int i,j;
if(r==n)
{
if(num==k)
ans++;
return;
}
else
{
for(i=0;i<n;i++)
{
if(nodanger(i,num))
{
for(j=0;j<n;j++)
a[r][j]=0;
a[r][i]=1;
dfs(r+1,num+1);
a[r][i]=0;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n<k)
printf("0\n");
else
{
memset(a,0,sizeof(a));
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
}
return 0;
}
【不知道说什么】
在学长讲的这么详细之上我还能wa了好几发,对不起我就是个傻子。