[大牛就是牛]双栈排序
【題目描述】
Tom最近在研究一個有趣的排序問題。如圖所示,通過2個棧S1和S2,Tom希望借助以下4種操作實現將輸入序列升序排序。
操作a
如果輸入序列不為空,將第一個元素壓入棧S1
操作b
如果棧S1不為空,將S1棧頂元素彈出至輸出序列
操作c
如果輸入序列不為空,將第一個元素壓入棧S2
操作d
如果棧S2不為空,將S2棧頂元素彈出至輸出序列
如果一個1~n的排列P可以通過一系列操作使得輸出序列為1, 2,…,(n-1), n,Tom就稱P是一個"可雙棧排序排列"。例如(1, 3, 2, 4)就是一個"可雙棧排序序列",而(2, 3, 4, 1)不是。下圖描述了一個將(1, 3, 2, 4)排序的操作序列:<a, c, c, b, a, d, d, b>
當然,這樣的操作序列有可能有幾個,對于上例(1, 3, 2, 4),<a, c, c, b, a, d, d, b>是另外一個可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。
【輸入格式】
輸入的第一行是一個整數n。第二行有n個用空格隔開的正整數,構成一個1~n的排列。
【輸出格式】
輸出共一行,如果輸入的排列不是"可雙棧排序排列",輸出數字0;否則輸出字典序最小的操作序列,每兩個操作之間用空格隔開,行尾沒有空格。
【輸入樣例】
3
2 3 1
【輸出樣例】
a c a b b d
【分析】
大家看看SQYBI大牛的題解吧:http://sqybi.com/blog/archives/78
?
#include <stdio.h> #include <iostream> #define MAXN 1010 using namespace std; int a[MAXN],zhan[3][MAXN],color[MAXN],f[MAXN]; int now,n; bool wujie; struct tnode {int num;tnode *next; } g[MAXN],*t; void insert(int x,tnode &p) {t = new(tnode);t->num = x;t->next = p.next;p.next = t; } void dfs(int x) {tnode *tt;tt = g[x].next;while (tt != NULL) {int y = tt->num;if (!color[y]) {color[y] = 3 - color[x];dfs(y);}if (color[y] == color[x]) {wujie = 1;return;}tt = tt->next;} } int main() {scanf("%d",&n);for (int i = 1;i <= n;++i)scanf("%d",&a[i]);f[n + 1] = 1000000000;for (int i = n;i > 0;--i)f[i] = min(a[i],f[i + 1]);for (int i = 1;i <= n;++i)for (int j = i + 1;j <= n;++j)if ((a[i] < a[j]) && (f[j + 1] < a[i])) {insert(j,g[i]);insert(i,g[j]);}for (int i = 1;i <= n;++i)if (!color[i]) {color[i] = 1;dfs(i);if (wujie)break;}if (wujie) {printf("0\n");return 0;}now = 1;for (int i = 1;i <= n;++i) {int x = color[i];zhan[x][++zhan[x][0]] = i;if (x == 1)printf("a ");elseprintf("c ");while ((a[zhan[1][zhan[1][0]]] == now) || (a[zhan[2][zhan[2][0]]] == now)) {if (a[zhan[1][zhan[1][0]]] == now) {printf("b ");--zhan[1][0];} else {printf("d ");--zhan[2][0];}++now;}} }轉載于:https://www.cnblogs.com/sephirothlee/archive/2010/10/12/1849154.html
總結
以上是生活随笔為你收集整理的[大牛就是牛]双栈排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析领域七大热门职业
- 下一篇: 需求阶段如何书写Use Case