Description
Description
有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,
只可惜是一个死胡同,而且站台只有一条轨道,
火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
(某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站?
占卜哥:闭嘴!)
就像这样:
出站<——- <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前20种可能的出栈方案。
注意:这题当然不等于全排列!!!
只可惜是一个死胡同,而且站台只有一条轨道,
火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
(某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站?
占卜哥:闭嘴!)
就像这样:
出站<——- <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前20种可能的出栈方案。
注意:这题当然不等于全排列!!!
Input
一个数n N<=20
Output
《字典序》输出前20种答案,每行一种,不要空格
Sample Input
3
Sample Output
123
132
213
231
321
132
213
231
321
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
stack<int>s;
int n, account = 0;
int a[20], mark[20] ={0};
void dfs(int cur);
int decide(int a[]);
int main()
{
cin>>n;
memset(a, 0, sizeof(a));
dfs(0);
return 0;
}
void dfs(int cur)
{
if(cur == n)
{
if(decide(a))
{
account++;
for(int i = 0; i < n; i++)
cout<<a[i];
cout<<endl;
}
return ;
}
for(int i = 1; i <= n; i++)
{
if(!mark[i])
{
mark[i] = 1;
a[cur] = i;
dfs(cur + 1);
if(account == 20)
return ;
mark[i] = 0;
}
}
}
int decide(int a[])
{
//先用全排列把所有可能找出来,然后,在模拟火车进站,看看是否与全排列找出的可以匹配
while(!s.empty())
{
s.pop();
}
int flag = 0;
int c;
for(int i = 1; i <= n; i++)
{
if(i == a[flag])
{
flag++;
}
else
{
if(s.empty())
s.push(i);
else
{
c = s.top();
if(c != a[flag])
{
s.push(i);
}
else
{
flag++;
s.pop();
i--;
}
}
}
}
while(!s.empty())
{
c = s.top(); s.pop();
if(c != a[flag++])
return 0;
}
return 1;
}
下面的是同学的代码~~~
#include <stdio.h>
#include <string.h>
#define N 25
int jc(int a[], int k);
void f(int a[], int k);
bool bz[N];
int n;
int count = 0;
int main()
{
memset(bz, 0, sizeof(bz));
scanf("%d", &n);
int a[N];
f(a, 0);
return 0;
}
void f(int a[], int k)
{
if(k == n){
if(jc(a, k)) return;
count ++;
for(int j = 0; j < n; j ++) printf("%d", a[j]);
printf("\n");
return;
}
for(int i = 1; i <= n; i ++){
if(! bz[i]){
a[k] = i;
bz[i] = 1;
f(a, k + 1);
if(count >= 20) return;
bz[i] = 0;
}
}
}
int jc(int a[], int k)
{
int ok;
for(int i = 0; i < k - 2; i ++){
ok = 0;
int min = 0xfffffff;
for(int j = i + 2; j < k; j ++){
if(a[i + 1] < min) min = a[i + 1];
if(min < a[j] && a[j] < a[i]) return 1;
}
}
return 0;
}