标签:源码
利用全部排列解决了火车进站问题,下面是题目和源码:
题目:给定一个正整数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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:源码
原文地址:http://blog.csdn.net/a375849201893857/article/details/46685841