HDU 1716 排列2
2013-03-24 15:44
381 查看
原帖链接:http://hi.baidu.com/nicker2010/item/0bf48bce92ccb92fe80f2eed
从最小的序列开始,找其下一个排列,找下一个排列的方法是字典序法:
1.找到比右边数字小的最大的下标,设为iI,即iI = max{i|num[i]<num[i+1]}
2.找到比num[iI]大的最大的下标,设为mI,即mI = max{i|num[i]>num[iI]}
3.交换num[iI]和num[mI]
4.将iI之后的串倒置
从最小的序列开始,找其下一个排列,找下一个排列的方法是字典序法:
1.找到比右边数字小的最大的下标,设为iI,即iI = max{i|num[i]<num[i+1]}
2.找到比num[iI]大的最大的下标,设为mI,即mI = max{i|num[i]>num[iI]}
3.交换num[iI]和num[mI]
4.将iI之后的串倒置
#include <iostream> #include <string> #include <algorithm> using namespace std; inline bool hasNext(const string& str) { return (!(str[0]>=str[1]&&str[1]>=str[2]&&str[2]>=str[3])); } void getNext(string& str) { int i,iI=0,mI=0;//iI表示比其右边数字小的最大下标,mI是大于iI的数字的最大下标 for(i=3; i>0; --i) if(str[i-1]<str[i]) { iI=i-1; break; } for(i=3; i>=0; --i) if(str[i]>str[iI]) { mI=i; break; } swap(str[iI],str[mI]); for(i=iI+1; i<(iI+1+4)/2; ++i) swap(str[i],str[4+iI-i]); } int main() { int Num[4],i; string cur; char pre; bool firstCase=true; while(cin>>Num[0]>>Num[1]>>Num[2]>>Num[3]) { if(Num[0]==0 && Num[1]==0 && Num[2]==0 && Num[3]==0)break; if(!firstCase) cout<<endl; firstCase = false; sort(Num,Num+4); cur.clear(); for(i=0; i<4; ++i)cur.push_back(Num[i]+'0'); i = 0; while(cur[i]=='0') ++i; pre = cur[i];//第一个非0数字 while(true) { if(cur[0]!='0') { if(cur[0]!=pre) { cout<<"\n"; pre=cur[0]; } cout<<cur; if(hasNext(cur)) { getNext(cur); if(cur[0]==pre) cout<<" "; } else { cout<<endl; break; } } else if(hasNext(cur)) getNext(cur); else { cout<<endl; break; } } } return 0; }
相关文章推荐
- HDU 1716 排列2
- hdu 1716 排列2
- HDU 1716 - 排列2
- HDU 1716 排列2 (STL全排)
- HDU-1716 排列2 (DFS)
- HDU-1716 排列2 (DFS)
- hdu 1716(排列2)
- hdu - 1716 排列2 (使用set对全排列结果去重)
- HDU 1716 排列2 (stl,next_permutation)
- hdu 1716 排列2(next_permutation函数应用)
- HDU 1716 排列2
- HDU 1716 排列2(简单的排列)
- hdu 1716 排列2
- HDU 1716 排列2
- hdu-1716 排列2(STL函数库运用)
- HDU 1716 排列2
- HDU 1716 排列2(排列生成,,next_permutation())
- HDU 1716 排列2
- hdu 1716 排列2 (dfs)
- hdu 1716 排列2(DFS搜索)