这段C语言代码有点看不懂

来源:百度知道 编辑:UC知道 时间:2024/05/27 09:37:28
我在网上看到一段关于全排的代码,有些不懂。
#include <stdio.h>

#define MAX 10
int used[MAX];
int result[MAX];
int N;

void print(){
int i;
for(i = 0; i < N; i++)
printf("%d ", result[i]);
printf("\n");
}
void proc(int step){
int i;
if(step == N)
print();
else{
for(i = 0; i < N; i++){
if(!used[i]){ //括号里是什么意思?
used[i] = 1; //why?不赋值不行吗?
result[step] = i + 1;
proc(step + 1);
used[i] = 0;
}
}
}
}

main(){
scanf("%d", &N);
proc(0);
}
你们都答的很好,可分只能给一个人呵,不管怎样,很谢谢
我正在学这方面的东西

这是递归求全排列, proc(step)表示正在排step位置的数字,used[i]表示数字i在之前的某个位置已经用了。
used[i] = 1;// 标识数字i用了
result[step] = i + 1; // 并把i填在step位置
proc(step + 1); // 递归填step之后的数字
used[i] = 0; // 现在把i填在step位置的所有情况都已经输出了,可以开始把其他数字填在step位置,所以标识i现在还没有用,在step以后的位置还可以用。

这个是很典型的深度优先搜索,如果有意的话了解一下这些基本算法就很容易明白的。
递归很重要。。。