火車進站(全排列)


Problem 44: 火車進棧


Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:2

Description

有n列火車按1到n的順序從東方左轉進站,這個車站是南北方向的,它雖然無限長,
只可惜是一個死衚衕,而且站臺只有一條軌道,
火車只能倒着從西方出去,而且每列火車必須進站,先進後出。
(某生:不就是個棧嗎?每次可以讓右側頭火車進棧,或者讓棧頂火車出站?
占卜哥:閉嘴!)
就像這樣:
出站<——- <——進站
|車|
|站|
|__|
現在請你按《字典序》輸出前20種可能的出棧方案。
注意:這題當然不等於全排列!!!

Input

一個數n N<=20

Output

《字典序》輸出前20種答案,每行一種,不要空格

Sample Input

3

Sample Output

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




發佈了50 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章