您的位置:首页 > 其它

hdu1716排列2

2010-08-11 19:59 190 查看
题目:hdu1716

代码:参考 http://forum.byr.edu.cn/pc/pccon.php?id=1041&nid=72574

//字典序法生成全排列
#include <iostream>
#include <string>
using namespace std;
string input,s;

void perm(){
int flag=1;
if(input[0]!='0'){flag=0;cout<<input;}s=input;
while(1){
int index=-1;
for(int i=input.size()-2;i>=0;i--) // 从最右开始,找到第一个比右边小的数字,赋值给index
{
if(input[i]<input[i+1]){
index=i;
break;
}
}
if(index==-1)break; // 所有排列遍历完,break while

char M='9'; // M为监视哨兼临时变量(for swap)
int C; // C为所找到数字的序号
for(int i=index+1;i<=input.size()-1;i++){ // 再从最右开始,找到input[index]右边比input[index]大的数字
if(input[i]<=input[index])continue;
if(input[i]<=M){
C=i;
M=input[i];
}
}
input[C]=input[index];
input[index]=M; // 交换input[index]和input[C]
int len=input.size()-1-index;
for(int i=1;i<=len/2;i++){ // 将index后面的部分倒置,比如7421,倒置为1247,只需要对称交换即可
char t=input[index+i];
input[index+i]=input[input.size()-i];
input[input.size()-i]=t;
}
if(input[0]=='0'){ s=input;continue; }
if(s[0]==input[0]){ cout<<' '<<input;s=input;flag=0; }
else { if(flag==0)cout<<endl<<input;else cout<<input; s=input; }
}
cout<<endl;
}

int main(){

char str[5];
int cnt=0;
//freopen("hdu1716in.txt","r",stdin);
//freopen("hdu1716out.txt","w",stdout);
while(cin>>str[0]>>str[1]>>str[2]>>str[3])
{
str[4]='\0';input=str;
if(str[0]=='0'&&str[1]=='0'&&str[2]=='0'&&str[3]=='0')break;
if(cnt)cout<<endl;cnt++;
perm();
}
//system("pause");
//注意:有些系统虽然支持 system("pause");
//但是如果循环会结束,运行到该句就会 Wrong answer
// 这是应该注意的地方。
return 0;
}
代码二:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
int a[5],num=0;
while(cin>>a[0]>>a[1]>>a[2]>>a[3]
&&(a[0]||a[1]||a[2]||a[3]))
{
if(num)cout<<endl;num++;
int flag=1,tmp;
do
{
if(a[0]==0)continue;
if(flag)
{ cout<<a[0]<<a[1]<<a[2]<<a[3];flag=0;}
else if(a[0]==tmp)
{
cout<<' '<<a[0]<<a[1]<<a[2]<<a[3];
}
else
{
cout<<endl<<a[0]<<a[1]<<a[2]<<a[3];
}
tmp=a[0];
}
while(next_permutation(a,a+4));
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: