ETH官方钱包

前往
大廳
主題

ZeroJudge - f860: 化學結構式 解題心得

Not In My Back Yard | 2021-06-01 00:00:04 | 巴幣 0 | 人氣 312

題目連結:


題目大意:
輸入有多列,每列給定一個有機化合物之中文名稱。該化合物只會是烷、烯、炔、醇、酸、酯這六類(本題只會出現(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
.......
.......
每一層我們會停留在紅色字元之部分,然後我們就輸出開頭到紅色字元的位置即可(雖然這樣照理說下面兩列空白列不會輸出,但是本題的輸出都是固定佔五列,所以就算是空白列還是得輸出並換行)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

0則留言

相關創(chuàng)作

更多創(chuàng)作