将M个白棋子与N个黑棋子排成一行,可以排成多种不同的图案。例如:2个白棋子和2个黑棋子,一共可以排成如下图所示的6种图案(根据组合数计算公式:
)
请你编写一段程序,输出M个白棋子与N个黑棋子能够组成的所有图案。
为了避免程序输出结果过多导致严重超时,特别限制:1≤M,N≤6
输入
输出
要求:每行输出一种图案,白棋子用0表示,黑棋子用1表示,按升序输出
样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">【测试样例1】
2 1
【测试样例2】
2 2
【测试样例3】
2 3</span></span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">【测试样例1】
001
010
100
【测试样例2】
0011
0101
0110
1001
1010
1100
【测试样例3】
00111
01011
01101
01110
10011
10101
10110
11001
11010
11100</span></span></span></span></span>
//问题 D:排列棋子
#include <iostream>
using namespace std;
int m,n,a[25]; //m+n个棋子,m+n个盒子,a-盒子
int used[2]; //黑白棋的数量
//第s个盒子放牌
void dfs(int s);
int main()
{
cin >> m >> n;
used[0]=m; //白棋的数量
used[1]=n; //黑棋的数量
dfs(1);
return 0;
}
//第s个盒子放棋子
void dfs(int s)
{
if(s == m + n + 1){
for(int i=1;i<=m+n;i++){
cout << a[i];
}
cout << '\n';
}
//枚学2种棋子
for(int i = 0;i < 2;i++){
if(used[i] > 0){
a[s]=i; //放入第s个盒子
used[i]--;
dfs(s + 1);
used[i]++; //回潮,取回牌
}
}
}