一种俗称“不撞南墙不回头”的算法,是一直往下尝试任何一种可能性,然后返回到上一级,上一级尝试完后,返回更上一级。。。。以此类推尝试完全部的可能性。
下面通过数的全排列来说明这个算法
在《啊哈,算法》里面看到一个很好的阐释,这里引用下
把每个数看做一个个扑克牌,比如进行0,1,2,3四个数的全排列,便可以看做有这四个扑克牌,然后有四个盒子,编号为0,1,2,3,很自然想到用数组模拟这个盒子。然后依次向后放扑克牌,知道放完了之后,便取回,放到上一级的盒子里面
#include <iostream>
int n ;
int arr[10] ;
int book[10] ;
using std :: cout ;
using std :: cin ;
using std :: endl ;
void dfs (int step) {
if (step == n + 1) {
for (int i = 0 ; i <= n ; i ++)
cout << arr[i] << " " ;
cout << endl ;
return ;
}
for (int i = 0 ; i <= n ; i ++) {
if (book[i] == 0) {
arr[step] = i ;
book[i] = 1 ;
dfs (step + 1) ;
book [i] = 0 ;
}
}
return ;
}
int main () {
cin >> n ;
while (n >= 10 || n < 0) {
cin >> n ;
}
dfs (0) ;
return 0 ;
}
由此可以得到一个关于这个算法的函数模型
void dfs (int step) {
判断边界
尝试每一种可能 for (int i = 0 ; i <= n ; i ++) {
继续下一步 dfs (step + 1) ;
}
return ;
}