详细的解读下面的C语言代码: #include <stdio.h> int n,mark[100],a[10]; void dfs(int step) { if(step>n) { for(int i=1;i<=n;i++) { printf("%d",a[i]); if(i==n) printf("\n"); } } else { for(int i=1;i<=n;i++) { if(mark[i]==0) { mark[i]=1; a[step]=i; dfs(step+1); mark[i]=0; } } } } int main() { scanf("%d",&n); dfs(1); return 0; }
时间: 2023-12-04 12:03:04 浏览: 37
这段 C 语言代码实现了全排列的功能,下面对其进行详细解读:
```c
#include <stdio.h>
/* 定义全局变量 n, mark[100], a[10] */
int n,mark[100],a[10];
/* 定义函数 dfs,参数为 step */
void dfs(int step) {
if(step>n) // 递归结束条件
{
for(int i=1;i<=n;i++) // 打印全排列
{
printf("%d",a[i]);
if(i==n) printf("\n"); // 换行
}
}
else
{
for(int i=1;i<=n;i++) // 枚举 1~n
{
if(mark[i]==0) // 判断 i 是否已经使用过
{
mark[i]=1; // 标记 i 已经使用过
a[step]=i; // 将 i 放到当前位置
dfs(step+1); // 递归下一步
mark[i]=0; // 回溯,将 i 标记为未使用
}
}
}
}
/* 主函数 */
int main() {
scanf("%d",&n); // 输入 n
dfs(1); // 从第一步开始递归
return 0;
}
```
这段代码的大致思路是:从 1 开始枚举每个位置应该填哪个数,如果该数未被使用过,则将其标记为已使用,并将其放到当前位置,然后递归下一步,递归结束条件是填完了 n 个位置,此时打印全排列。如果该数已被使用,则跳过该数。如果递归到某一步无解,则回溯到上一步重新选择。整个过程通过递归实现,代码结构较为简单。