一.题目
二.思路
深度优先遍历+回溯法
三.代码
#include<stdio.h>
#include<malloc.h>
int n, m;
int* path;
int count[2];//0代表-,1代表o
int key;//第k个
long long int count_ = 0;
void init() {
printf("请输入n,m,k:");
scanf("%d %d %d", &n, &m, &key);
path = (int*)malloc(sizeof(int) * (n + m));
count[0] = n;
count[1] = m;
}
void search(int depth) {
if (depth == n + m) {
count_++;
if (count_ == key) {
for (int i = 0; i < n + m; i++) {
if (path[i] == 0)
printf("-");
else
printf("o");
}
printf("\n");
}
return;
}
for (int i = 0; i < 2; i++) {
if (count_ == key)
return;
if (!count[i])
continue;
count[i]--;
path[depth] = i;
search(depth + 1);
count[i]++;
}
}
int main() {
init();
search(0);
free(path);
return 0;
}
四.总结
1.全排列的变种题。
2.图的基本运用。
3.目前我还没有更好的做法。
4.递归图