[DFS]最简题-搜索字母排列
2013-12-29 10:57
218 查看
题目链接:http://lightoj.com/volume_showproblem.php?problem=1023
题目描述:生成前n个字母的前k个排序
解题思路:
基本是航神指导~用DFS的思想来写,很简单所以没啥好说的。DFS最水题告诉我们怎么DFS。详细的下面代码有注释。
其实一开始还是有没弄明白的地方,就是为什么找到未使用的之后,dfs(s+1)之后还要把use[i]还原为false呢?
大概是这么回事~比如生成ABC,A用完不标回去,接着搜第二个位置上字母,B被选入字符串,同理C也是,最后生成ABC,但这时第二位置上不会再把C选进去了,也就是不会生成ACB,同理BAC、BCA神马的也就都没有了,只能生成一个ABC。所以做DFS的时候要注意状态的变化、还原,能够对整体状态修改维护也是DFS的一个特点(有时也是优点吧~)。
AC代码:
题目描述:生成前n个字母的前k个排序
解题思路:
基本是航神指导~用DFS的思想来写,很简单所以没啥好说的。DFS最水题告诉我们怎么DFS。详细的下面代码有注释。
其实一开始还是有没弄明白的地方,就是为什么找到未使用的之后,dfs(s+1)之后还要把use[i]还原为false呢?
大概是这么回事~比如生成ABC,A用完不标回去,接着搜第二个位置上字母,B被选入字符串,同理C也是,最后生成ABC,但这时第二位置上不会再把C选进去了,也就是不会生成ACB,同理BAC、BCA神马的也就都没有了,只能生成一个ABC。所以做DFS的时候要注意状态的变化、还原,能够对整体状态修改维护也是DFS的一个特点(有时也是优点吧~)。
AC代码:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int n,k; bool use[30]; //定义use数组记录使用情况 char str[30]; //答案的字符数组 void dfs(int s) //S指的是当前要填第S个字母 { int i; if(k==0)return; else if(s==n) { printf("%s\n",str); k--; } //计数前K个排列 else { for(i=0;i<n;i++) //搜索第i个字母 { if(!use[i]) //如果未被使用 { str[s]='A'+i; use[i]=true; dfs(s+1); //填入位置S;标记已被使用;dfs(s+1) use[i]=false; //标回未被使用,搜索下一字母 } } } } int main() { int T,i=1; cin>>T; while(i<=T) { memset(use,0,sizeof(use)); memset(str,0,sizeof(str)); cin>>n>>k; cout<<"Case "<<i<<":"<<endl;i++; dfs(0); } return 0; }AC截图:
相关文章推荐
- 根据26字母排列来搜索排列全国城市
- DFS搜索排列与组合
- 搜索_DFS_全排列
- UVA 725 除法(DFS搜索排列)
- dfs深度优先搜索 1~N 的排列理解dfs,抽象为n个数放n个盒子
- HDOJ-1501 字符排列问题[字符搜索DFS()]
- hdu 1716 排列2(DFS搜索)
- Android 联系人列表界面(仿iphone、A~Z字母排列、过滤搜索)
- hdu 1716 排列2(DFS搜索)
- Xcode中的搜索结果前的字母C,T,E,Pr,f代表什么
- HDU 5612 Baby Ming and Matrix games(dfs搜索)
- 在控制台上输入一个字符串,将其中夹杂的字母去除,只剩数字,然后对对这些数字进行全排列,输出全排列结果
- 深度优先搜索DFS( 递归+非递归)
- 深度优先搜索Depth-first search (DFS) for undirected graphs
- HDU 5887 Herbs Gathering 01背包+DFS搜索 *
- 关于开源项目侧边栏字母搜索列表ListViewFilter的bug解决办法
- POJ 3187 Backward Digit Sums (杨辉三角,穷竭搜索,组合数,DFS)
- 问题 N: 字母排列
- HDU/HDOJ 1241 Oil Deposits (DFS)深度优先搜索
- ACM-POJ 1562 DFS 深度优先搜索