生成排列 Generating Permutations

来源:互联网 发布:cocostudio mac 下载 编辑:程序博客网 时间:2024/05/22 12:56

逆向思考。操作1不变,操作2等价于将尾部数字放到头部,这样最后只需要逆序输出操作序列即可。具体做法把序列看作环状的,每次操作2就等价于移动头部的位置,用操作1每次维护头部的最小元素,再执行操作2。这个过程类似于排序,当a[0]==1或n时就不做操作1(a[0]==n时这时的头部进行多次操作2最终会变为尾部)。

//紫书P254 生成排列 //Serene#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<vector>using namespace std;const int maxn=300+10;int n,a[maxn];vector<int> ans;bool ok(){for(int i=0;i<n-1;++i)  if(a[i]>a[i+1]) return 0;return 1;}int main() {while(scanf("%d",&n)!=EOF) {if(!n) {cout<<"\n";continue;}ans.clear();for(int i=0;i<n;++i) scanf("%d",&a[i]);while(1){if(ok()) break;if(a[0]!=n&&a[1]<a[0]) {ans.push_back(1);swap(a[0],a[1]);}if(ok()) break;ans.push_back(2);            int v=a[n-1];            for(int i=n-2;i>=0;--i)                a[i+1]=a[i];            a[0]=v;}for(int i=ans.size()-1;i>=0;--i) printf("%d",ans[i]);printf("\n");}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 舌头上起泡怎么办很疼 月经来了二十多天还不干净怎么办 三岁宝宝缺锌怎么办 无舌苔,舌头很红怎么办 嘴唇上肿了一块怎么办 下嘴唇突然肿了怎么办 上嘴唇突然肿厚怎么办 舌尖上火了好疼怎么办 舌头针扎似的疼怎么办 手麻了怎么办小妙招 月子生气奶少了怎么办 颈椎会引起脸麻怎么办 脑梗引起的手麻怎么办 着凉引起的腰疼怎么办 受凉引起的腰疼怎么办 着凉了腰疼厉害怎么办 腰疼压迫神经腿麻木怎么办 运动后小腿变粗怎么办 跑步后小腿变粗怎么办 嘴腮里面肉肿了怎么办 左胳膊左腿发麻怎么办 右胳膊和右腿麻怎么办 站久了腿肿胀疼怎么办 坐电脑前脖子疼怎么办 一做颈椎就疼怎么办 出了月子腿疼怎么办 坐久了屁股麻木怎么办 搬东西把腰扭了怎么办 蹲时间长了脚麻怎么办 马桶坐久了腿麻怎么办 睡觉手麻怎么办小妙招 手麻了怎么办小妙招吗 腰疼的不能动怎么办 三岁宝宝腿抽筋怎么办 腿抽筋后一直疼怎么办 小腿筋疼怎么办腿无力 小腿里面的筋疼怎么办 腿抽筋,第二天疼怎么办 脚肿了怎么办消肿止痛 颈椎压迫神经手麻怎么办 上课睡觉手麻了怎么办