c语言代码题 有重复全排列 [2*] 输出N个数的有重复全排列 Input 一个整数N 1<=N<=5 Output 输出n个数的有重复全排列 Sample Input 3 Sample Output 111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311 312 313 321 322 323 331 332 333
时间: 2024-03-03 12:48:44 浏览: 11
这是一个比较经典的回溯算法问题,可以用递归来实现。下面是一个 C 语言的实现:
```c
#include <stdio.h>
int n;
int nums[6];
void dfs(int index) {
if (index > n) {
for (int i = 1; i <= n; i++) {
printf("%d", nums[i]);
}
printf("\n");
return;
}
for (int i = 1; i <= n; i++) {
nums[index] = i;
dfs(index + 1);
}
}
int main() {
scanf("%d", &n);
dfs(1);
return 0;
}
```
输入样例:
```
3
```
输出样例:
```
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333
```
相关问题
用c语言输出n个数的有重复全排列
以下是用 C 语言输出 n 个数的有重复全排列的代码:
```c
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void permute(int *arr, int start, int end) {
if (start == end) {
for (int i = 0; i <= end; i++) {
printf("%d ", arr[i]);
}
printf("\n");
} else {
for (int i = start; i <= end; i++) {
int flag = 1;
for (int j = start; j < i; j++) {
if (arr[j] == arr[i]) {
flag = 0;
break;
}
}
if (flag) {
swap(&arr[start], &arr[i]);
permute(arr, start + 1, end);
swap(&arr[start], &arr[i]);
}
}
}
}
int main() {
int n;
printf("请输入 n:");
scanf("%d", &n);
int *arr = (int *) malloc(n * sizeof(int));
printf("请输入 %d 个数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
permute(arr, 0, n - 1);
free(arr);
return 0;
}
```
如果您有任何问题或需要进一步解释,请随时问我。
用c语言dfs输出n个数的有重复全排列
下面是使用C语言实现DFS输出n个数的有重复全排列的示例代码:
```c
#include <stdio.h>
#define MAXN 10
int n;
int a[MAXN];
int vis[MAXN];
void dfs(int step)
{
if (step == n) {
for (int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
vis[i] = 1;
a[step] = i;
dfs(step + 1);
vis[i] = 0;
}
}
}
int main()
{
scanf("%d", &n);
dfs(0);
return 0;
}
```
在这个示例代码中,我们使用了一个数组a来存储当前的排列,使用vis数组来记录哪些数字已经被使用过了。在dfs函数中,我们先判断是否已经完成了一次排列,如果完成了,就直接输出结果并返回;否则就从1到n枚举当前位置可以放置的数字,如果这个数字还没有被使用过,就将其放入数组a中,并标记vis数组中对应的位置为已使用,然后递归调用dfs函数继续生成下一个位置的数字,最后将vis数组中对应位置的标记撤销,以便后续的排列可以使用这个数字。
需要注意的是,这个示例代码中并没有去重,也就是说,如果n个数字中有重复的数字,那么会生成重复的排列。如果需要去重,可以在dfs函数中添加一个判断,如果当前位置可以放置的数字和上一个位置放置的数字相同,就直接跳过。