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;
}
}
}
}