『算法-ACM 竞赛』杭电的题,输出格式卡的很严。HDU_ 1716 排列 2
题很简单,一开始写代码,是用整数的格式写的,怎么跑都不对,就以为算法错了,去看大佬们的算法 STL 全排列:next_permutation(); 又双叒叕写了好几遍,PE 了将近次,直到跑了大佬代码发现,原来格式是这样的。
下面是实现全排列的两段代码,睡觉睡觉。
STL 电动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<iostream> #include<cstdio> #include<cstring> #include<map> #include<set> #include<algorithm> using namespace std; int main() { char a[4]={0}; int x=0; for(;;) { for(int i=0;i<4;i++) { cin>>a[i]; } sort(a,a+4); char w=a[0]; if(a[0]=='0'&&a[1]=='0'&&a[3]=='0'&&a[2]=='0') break; if(x) cout<<endl; x++; int qt=0; int lasta0=-1; bool flag2=true; do { if(a[0]=='0')continue; if(flag2)flag2 = false; else if(a[0] == lasta0) cout<<' '; else cout<<endl; cout<<a[0]<<a[1]<<a[2]<<a[3]; lasta0 = a[0]; } while(next_permutation(a, a +4)); cout<<endl; } return 0; }
|
纯手动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<iostream> #include<cstdio> #include<cstring> #include<map> #include<set> #include<algorithm> using namespace std; set<int> mx; int main() { int a[5]; int sb=0; for(;;) { mx.clear(); int multi; for(int i=1;i<5;i++) { cin>>a[i]; } if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0) break; if(sb)cout<<endl; sb++; for(int i=1;i<5;i++) { for(int j=1;j<5;j++) { if(i==j) continue; for(int k=1;k<5;k++) { if(j==k||i==k) continue; for(int l=1;l<5;l++) { if(k==l||l==j||l==i) continue; multi=a[i]*1000+a[j]*100+a[k]*10+a[l]; if(multi>999) mx.insert(multi); } } } } set<int>::iterator poi,p2; p2=mx.begin(); int xa=0; for(poi=mx.begin();poi!=mx.end();poi++) { p2++; if(xa) cout<<' '; xa++; cout<<*poi; if(*p2/1000!=*poi/1000) { cout<<endl; xa=0; } } } return 0; }
|