标签:表示 info clu 判断 har 分享 temp 产生 输出
题目描述】 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。 【输入】 只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。 【输出】 输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义: 已知S=s1s2...sk,T=t1t2...tkS=s1s2...sk,T=t1t2...tk,则S<T等价于,存在p(1≤p≤k),使得s1=t1,s2=t2,...,sp?1=tp?1,sp<tps1=t1,s2=t2,...,sp?1=tp?1,sp<tp成立。 【输入样例】 abc 【输出样例】 abc acb bac bca cab cba
#include <bits/stdc++.h> using namespace std; bool vis[15]; char str[15],temp[15]; int n; void dfs(int s) { if(s==n) //判断是否可以输出字符串 { temp[s]=‘\0‘; cout<<temp<<endl; } for(int i=0;i<n;i++) //循环,第一层循环有三个,每个循环会有新的dfs递归,又会产生循环(符合循环条件的只有两个),依次循环递归下来到最后一个dfs就直接打印输出字符串 { if(vis[i]==0) { vis[i]=1; //用字母 temp[s]=str[i]; dfs(s+1); vis[i]=0; } } } int main() { cin>>str; n=strlen(str); dfs(0); //调用dfs函数 return 0; }
dfs、回溯搜索;
递归到最大深处就打印,打印完了就返回上一层的for循环继续填充下一个字母,循环结束继续返回上一层;就像回溯搜索一样,把数据存储下来,一步步走完后回退到上一个数据继续走完;
vis表示字母用没用过,用过就不会保存在temp数组中,没用过会用,dfs完了之后会置零表示没用过;
emmmmmdfs过程大概就如下吧
标签:表示 info clu 判断 har 分享 temp 产生 输出
原文地址:https://www.cnblogs.com/liufei-/p/10134367.html