Description
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1 7 3
Sample Output
8
每一行或者每一列都只有一个棋子,那么可以逐行判断是否可以添加棋子,判断到第i行时,若第j列出现了棋子,则将j列标记
#include
#include
#include
#include
int n,k;
int sum;
char a[10][10];
int pd[10];
//int p[8][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0},{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
using namespace std;
// 若某一列中出现了#则标记该列,然后逐行判断
void bfs(int h, int num)
{
if(num == k)
{
sum++;
return;
}
for(int i = h; i < n; i++)
{
for(int j = 0;j < n; j++)
{
if(a[i][j] == '#' && !pd[j])
{
pd[j] = 1;
bfs(i + 1, num + 1);
pd[j] = 0;
}
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d%d", &n, &k))
{
if(n == -1 && k == -1) break;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
memset(pd,0,sizeof(pd));
sum = 0;
bfs(0,0);
printf("%d\n", sum);
}
return 0;
}