您的位置:首页 > 其它

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之后的串倒置

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: