码迷,mamicode.com
首页 > 其他好文 > 详细

全排列——火车进站问题(华为OJ)

时间:2015-06-30 10:52:12      阅读:1304      评论:0      收藏:0      [点我收藏+]

标签:源码

今天发现一个非常好用的函数next_permutation(),利用这个函数这以很容易的列出一组数据的所有排列组合。

利用全部排列解决了火车进站问题,下面是题目和源码:
题目:给定一个正整数N代表火车数量,0

#include<vector>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>

using namespace std;

//////////////////////////////////////////////////////////////////
/*int judge(string s1,string s2)    ////判断排列是否符合入栈出栈顺序
{
    stack<char> a;
    int len = s2.size();
    int i=1,j=0;
    a.push(s1[0]);
    for(j=0;j<len;j++)
    {
        if(i!=len)
        {
            if(a.empty()) a.push(s1[i++]);
            while(a.top()!=s2[j])
            {
                if(i==len) break;
                a.push(s1[i]);
                i++;
            }
        }
        if(a.top()==s2[j])
            a.pop();
    }

    if(a.empty()) return 1;
    else return 0;
}*/
/////////////////////////////////////////////////////////////
//符合顺序:它后面的每一个比它小的数都是降序的///////////////
int judge(string s1,string s2)//默认s1是升序的,不然没法做
{
    int len = s2.size();
    int i=0,flag=0,j=0;
    for(i=0;i<len;i++)
    {
        flag=1000;
        for(j=i+1;j<len;j++)
        {
            if(s2[j]<s2[i])
            {
                if(s2[j]>flag) return 0;
                flag = s2[j];
            }
        }
    }
    return 1;
}

int pos(string s,char c)
{
    for(unsigned int i=0;i<s.size();i++)
    {
        if(s[i]==c) return i;
    }
    return 0;
}

int main(void)
{
    string s = "abcdefghij";
    string flag;
    unsigned int num=0,i=0,j=0,m=0,n=0;
    char in[10];
    vector<string> str;
    char out[10][10];
    //输入///////////////////
    cin>>num;
    getchar();
    for(i=0;i<num;i++)
    {
        cin>>in[i];
        getchar();
    }
    /////////////////////////////////////
    s.assign(s,0,num);//截取前面一段
    flag = s;
    //获得全排列,放进str中///////////////
    str.push_back(s);
    while(next_permutation(s.begin(),s.end()))
    {
        str.push_back(s);
    }
    /////对应到输入的顺序////////////////////////////////
    for(i=0;i<str.size();i++)
    {
        if(judge(flag,str[i]))
        {
            for(j=0;j<str[i].size();j++)
            {
                out[m][n]=in[pos(flag,str[i][j])];
                n++;
            }
            out[m][n] = ‘\0‘;
            n=0;
            m++;
        }
    }
    ///////输出////////////////////////////////////////////////
    string ss[10];
    for(i=0;i<m;i++)
    {
        ss[i] = out[i];
    }
    sort(ss,ss+m);

    for(i=0;i<m;i++)
    {
        cout<<ss[i][0];
        for(j=1;j<num;j++)
        {
            cout<<" "<<ss[i][j];
        }
        cout<<endl;
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

全排列——火车进站问题(华为OJ)

标签:源码

原文地址:http://blog.csdn.net/a375849201893857/article/details/46685841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!