全排列之后判断是否符合要求,模拟火车进栈的情况
这里其他的是没有什么问题的,然后是否有序这里的话,是根据模拟做的,
//这里可以写两个数组
入栈数组 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; }