生成排列(Generating Permutations, UVa11925)

来源:互联网 发布:linux内核内存管理浅析 编辑:程序博客网 时间:2024/06/06 09:36
题目描述:给你一个特定序列,要求你经过一定的变换规则将升序列变为给的特定序列。变换规则为:1.第一个元素和第二个元素交换. 2、首元素到尾部。
题目分析:借鉴的别人的。将一个升序列变为特定序列显然不如把这个特定序列变为一个升序列容易。那么就逆着处理,最后输出的时候倒着输出就行了。方法类似于冒泡排序的思想,若第一个元素大于第二个元素则交换,否则将最后一个元素变为首元素。注意:到第一个元素是n时,不进行交换,否则会出现死循环。
代码如下:

#include <iostream>#include <cstdio>#include <deque>#include <vector>using namespace std;const int maxn=300+10;deque <int> rise,in_num;vector<int> out_num;int n;bool judge(){    for(int i=0; i<n; i++)    {        if(in_num[i]!=rise[i])        {            return false;        }    }    return true;}void two(){    int temp=in_num.back();    in_num.pop_back();    in_num.push_front(temp);}void one(){    swap(in_num[0],in_num[1]);}bool solve(){    if(judge()) return true;    while(1)    {        if(in_num[0]>in_num[1]&&in_num[0]!=n)        {            one();            out_num.push_back(1);            if(judge()) return true;        }        else        {            two();            out_num.push_back(2);            if(judge()) return true;        }    }}int main(){    while(scanf("%d",&n)==1&&n)    {        rise.clear();        in_num.clear();        out_num.clear();        int x;        for(int i=0; i<n; i++)        {            scanf("%d",&x);            in_num.push_back(x);            rise.push_back(i+1);        }        solve();        for(int i=out_num.size()-1; i>=0; i--)        {            cout << out_num[i];        }        cout << endl;    }    return 0;}

刚做了上一个题类似于选择排序的题,这个又类似于冒泡排序。上一题链接:
起重机(Crane, ACM/ICPC CERC 2013, UVa1611)

0 0