递归程序如何编写:
1.确定出口(剪枝)叶子节点,数组边界,
2.确定参数(一般有每次递归会变得参数(递归层数,距离之和),此层相关的数组下标(节点标号),求解的一般是最值,可以设置为全局变量,还有权重数组,ans,vis,节点数量)
3.回溯(递归过程中,如果改变了节点的属性,需要把它改回来,例如全排列的swap两次,比如bfs可能需要考虑是否访问)
4.dfs中的for循环(或者几个dfs连在一起)的意思是想要把当前一层的所有下一层可能遍历一次
#include<iostream> #include<algorithm> using namespace std; int n; //非字典序方法一:递归确定第一个,然后确定后面n-1个全排列 //void swap(int i, int j, int a[]) { // int t = a[i]; // a[i] = a[j]; // a[j] = t; //} // //void dfs(int flag, int a[]) { // if (flag == n - 1) { // for (int i = 0; i < n; ++i) { // printf("%d",a[i]); // } // // } // for (int j = flag; j <n ; ++j) { // swap(flag,j,a); // dfs(flag+1,a); // swap(flag,j,a); // } //} // // //int main() { // scanf("%d", &n); // int a[n]; // for (int i = 0; i < n; i++) { // a[i] = i+1; // } // dfs(0, a); // return 0; //} //方法二:字典序:从右想左先找到相邻的左边比较小的(12354找到3)pi,然后从右向左Pn-1 - pi找到第一个大于pi的pj,将pi,pj交换,将pi之后的反转。 //
123456789101112131415161718192021222324252627282930313233343536373839