全排列之后判断是否符合要求,模拟火车进栈的情况
这里其他的是没有什么问题的,然后是否有序这里的话,是根据模拟做的,
//这里可以写两个数组
入栈数组 stackIn 出栈数组 stackOut 变量 in out
首先1、如何数组的头和出栈数组的头是能对的上 in++ out++
2、和栈顶元素是对的上 in++ stk.pop()
3、都对不上但是能入栈 in++ 入栈
4、前三种情况都不行 也就是说即和出栈数组对不上 又和栈顶元素对不上 又没有元素可以入栈
也就是说没法匹配 那么就返回假
这个循环结束都没有返回假,就是匹配完了,返回真
#include<iostream>
#include<stack>
using namespace std;
bool vis[15];
int stackOut[15],step=0,n,stackIn[15];
//判断顺序
bool judge();
void dfs(int step){
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
stackOut[step]=i;
if(step==n){
if(judge()){
for(int j=1;j<=n;j++){
cout<<stackOut[j]<<" ";
}
cout<<endl;
}
}else{
dfs(step+1);
}
vis[i]=0;
}
}
}
//根据入栈顺序判断出栈顺序是否合理
bool judge(){
int in=1,out=1;
stack<int> stk;
while(out<=n){
//和入栈顺序对的上
if(in<=n&&stackOut[out]==stackIn[in]){
out++;
in++;
//和栈顶元素对的上
}else if(!stk.empty()&&stk.top()==stackOut[out]){
stk.pop();
out++;
//即跟入栈顺序不一样,也跟栈顶元素不一样
}else if(in<=n){
//入栈
stk.push(stackIn[in]);
in++;
}else{
return false;
}
}
return true;
}
int main(){
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>stackIn[i];
}
dfs(1);
}
return 0;
} 
京公网安备 11010502036488号