因为比较菜,网上很多都是画树来做的,我现在还没学到(可能以后一个月之后?会学到) ,所以出了一个简单的ans和思路;
符号说明:
step:元素在数组的位序(1<=step<=n)
flag[x]:数字x是否被占用(我一开始没想到是这个意思,还以为x是位序
a[step]:输出的答案数组
回溯法:
找到递归后面的终止条件,简单的情况就是越界(step>n)
然后如果没有越界,那么就往数组里面填数字,从1开始填
然后注意对数字使用状态做标记(flag
先给数组赋值,再改变其状态;
利用递归函数,让整个选择可能性纵向展开;
直到for循环结束,就可以回溯了;其中return在这里是指回溯的意思;
其他的都写在注释里面了;
最后别忘记对所有的a[]和flag[]进行初始化;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int flag[11] = { 0 };//占位标记
int a[] = { 0 };
void PrintArray(int *a, int n) {
int i = 0;
for (i = 1; i<=n; i++) {
prin