基本概念:
深度优先搜索算法:一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点V的所在边都已被搜寻过或者在搜寻时节点不满足,搜索将回溯到发现节点V的那条边的起始节点。整个过程反复进行直到所有节点都被访问为止。最糟糕时算法复杂度O(!n)。
输入样例:
6 a c b d e f
输出样例:
a
c
b
d
e
f
提交:
#include <iostream> #include <string.h> using namespace std; //全排列,n个字符依次放入n个箱子中,首先检查箱子是否为空,手中还有什么字符,放进去并标记。 //放完一次恢复初始状态,当到n+1各箱子时,一次排列结束 int n; char a[6]; char re[6]; int vis[6]; void dfs(int step) { int i; if (step == n+1) {//判断边界 for (i=1; i<=n; i++) printf("%c",re[i]); printf(" "); return ; } for (i=1;i<=n;i++) {//遍历每一种情况 if (vis[i] == 0) {//check满足 re[step] = a[i]; vis[i]=1;//标记 dfs(step+1);//继续搜索 vis[i]=0;//恢复初始状态 } } return; } int main() { int T; scanf("%d",&T); getchar(); while(T--){ memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis));//对存数据的数组分别初始化 scanf("%s",a+1); n = strlen(a+1); dfs(1);//从第一个箱子开始 } return 0; }