Problem 44: 火车进栈
Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:2
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<stdio.h>
#define MAXSIZE 25
int a[MAXSIZE] = {0};
int s[MAXSIZE] = {0}; //标记数组
int n;
int num, k;
void dfs(int j);
int main()
{
int count;
// scanf("%d", &count);
// while(count--)
// {
// k = 0, num = 0;
int j = 0;
scanf("%d", &n);
dfs(0);
// if(k)
// continue;
// }
return 0;
}
void dfs(int j) //深搜
{
int i, b[2], m = 0;
if(j == n)
{
int flag = 1;
for(i = 0; i < n; i++) //对每个a【i】 判断其后比它小的数是否为降序序列
{
m = 0;
for(j = i + 1; j < n && flag; j++)
{
if(a[i] > a[j])
{
if(m == 0) b[m++] = a[j]; //记录str[i]后比它小的数
else
{
if(a[j] > b[0]) //如果之后出现的数比记录的数还大,改变标记变量
flag = 0; // 重点(此时已经不符合条件)
else
b[0] = a[j]; //否则记录这个更小的数
}
}
}
}
if(flag)
{
num++;
for(i = 0; i < n; i++)
printf("%d", a[i]);
printf("\n");
}
return ;
}
else
{
for(i = 0; i < n; i++)
{
if(s[i] == 0)
{
s[i] = 1; //s【i】被标记,注意i是从0开始,所以要把i+1赋给a【j】
a[j] = i + 1; //j是下标
if(num == 20)
{
k = 1;
break;
}
dfs(j + 1);
s[i] = 0;
}
}
}
}