題目連結:
題目大意:
輸入有多列,每列給定一個有機化合物之中文名稱。該化合物只會是烷、烯、炔、醇、酸、酯這六類(本題只會出現(xiàn)直鏈烴基),而碳的個數(shù)最多為 20 個(以甲、乙、丙、丁、戊、己、庚、辛、壬、癸、十一、……、二十表示)。
本題的烯、炔類的雙鍵、三鍵皆位於直鏈的最左邊。因此本題只會出現(xiàn) 1-丁烯 、 1-己烯等,不會出現(xiàn) 2-丁烯 、 3-己烯等等。類似地,酸跟醇類之羧基(-COOH)和羥基(-OH)皆位於直鏈的最右側。至於酯類只會由前面提及的酸類以及醇類組合而成,酸在左、醇在右。
請依照範例輸出格式輸出給定的化合物之結構,其中我們以「-」和「|」分別代表橫向以及縱向的單鍵、「=」作為雙鍵(不論橫縱)、「%」作為三鍵且每一列的結尾不含多餘的空白。輸出完結構式後再輸出一列的 "----------"。
範例輸入:
範例輸入 #1
丙烷
丁醇
丁酸丙酯
十五烯
範例輸入 #2
甲醇
甲酸乙酯
十二酸
戊炔
範例輸出:
範例輸出 #1
H H H
| | |
H-C-C-C-H
| | |
H H H
----------
H H H H
| | | |
H-C-C-C-C-O-H
| | | |
H H H H
----------
H H H O H H H
| | | = | | |
H-C-C-C-C-O-C-C-C-H
| | | | | |
H H H H H H
----------
H H H H H H H H H H H H H H H
| | | | | | | | | | | | | | |
H-C=C-C-C-C-C-C-C-C-C-C-C-C-C-C-H
| | | | | | | | | | | | |
H H H H H H H H H H H H H
----------
範例輸出 #2
H
|
H-C-O-H
|
H
----------
O H H
= | |
H-C-O-C-C-H
| |
H H
----------
H H H H H H H H H H H O
| | | | | | | | | | | =
H-C-C-C-C-C-C-C-C-C-C-C-C-O-H
| | | | | | | | | | |
H H H H H H H H H H H
----------
H H H
| | |
H-C%C-C-C-C-H
| | |
H H H
----------
解題思維:
模擬即可。
先將甲、乙、丙、丁、戊、己、庚、辛、壬、癸、十一、……、二十,這些中文數(shù)字對應的阿拉伯數(shù)字建成表以供查詢。
接著我們可以看到每個化合物的結構「高度」皆佔五列的輸出,所以我們可以用一個 5 列 100 行二維字元陣列儲存化合物的結構,然後用一個變數(shù) L 儲存現(xiàn)在的結構有幾層。
例如丙烷的結構為
H H H
| | |
H-C-C-C-H
| | |
H H H
我們可以拆成以下九層(以下用「.」充當空白):
. . H . H . H . .
. . | . | . | . .
H 、 - 、 C 、 - 、 C 、 - 、 C 、 - 、 H
. . | . | . | . .
. . H . H . H . .
因此,我們就慢慢地疊上每一層結構便可以得到整體結構。
對於烷類(假設有 X 個碳)我們可以先放一層的
.
.
H
.
.
接著放以下結構放 X 次
. H
. |
- 、 C
. |
. H
最後再放一層
. .
. .
- 、 H
. .
. .
即可完成烷類的結構式(等等再討論如何處理輸出時的多餘空白)。
而烯類以及炔類,則是先依照同碳數(shù)烷類的作法填充二維字元陣列,接著將最左邊五層替換成
. . H . H
. . | . |
H 、 - 、 C 、 = 、 C
. . . . .
. . . . .
便得到了烯類。而最左邊替換成
. . . . .
. . . . .
H 、 - 、 C 、 % 、 C
. . . . .
. . . . .
則會得到炔類。
醇類則是將同碳數(shù)烷類最右邊的那一層(第 L 層)替換成
.
.
O
.
.
然後再加上兩層(所以醇類會比同碳數(shù)烷類多兩層)
. .
. .
- 、 H
. .
. .
便完成了醇類結構。
而有機酸類(假設有 X 個碳),我們可以先產(chǎn)生 X - 1 個碳的烷類,然後將最右邊那一層替換為
O
=
C
.
.
然後再依序加上
. . . .
. . . .
- 、 O 、 - 、 H
. . . .
. . . .
這四層即可。
最後是酯類,其為酸類以及醇類組成(假設酸有 X 個碳、醇有 Y 個碳)。先產(chǎn)生出有 X 個碳的有機酸類,然後捨棄掉最後三層,並記錄現(xiàn)在的層數(shù)為 M。然後再疊加 Y 個碳的烷類。最後將第 M 層替換為
.
.
O
.
.
即可。
那麼輸出時,要怎樣才能不輸出多餘的空白呢?我們可以藉由著記錄總層數(shù)的變數(shù) L 來達成:
對於每一列,我們從第 L 層往左跑直到我們遇到第一個不是空白的字元。
例如乙烯為
..H.H..
..|.|..
H-C=C-H
.......
.......
每一層我們會停留在紅色字元之部分,然後我們就輸出開頭到紅色字元的位置即可(雖然這樣照理說下面兩列空白列不會輸出,但是本題的輸出都是固定佔五列,所以就算是空白列還是得輸出並換行)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。