本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。
地板上有 $n$ 個磁磚,從左到右排成一排,每個磁磚可以用一個數字代表它的顏色,一開始每個磁磚的顏色可能是 1 或 2。我們稱這些磁磚是美麗的若符合以下兩個條件:
舉例來說,若 $n = 6$ 時,1 1 2 2 1 2 是美麗的,但 1 2 2 1 1 2、1 2 1 1 1 2 都不是。
現在你的目標是要判斷磁磚初始的樣子是不是美麗的,然而你並不知道這些磁磚的樣子,也不知道 $n$ 的大小,你唯一可以做的事情是在第一塊磁磚上面擺上一隻機器人,且一開始機器人身上會顯示數字 $1$。機器人可以讀取一些資訊,你可以藉由這些資訊決定機器人要如何移動,並讓機器人經過一系列的移動後判斷出答案。更清楚來說,機器人在移動前會讀取三個變數 $\text{current\_color}, \text{current\_state}$ 以及 $\text{wall}$,代表的意義如下:
讀取完這些資訊後,機器人會藉由這些資訊以及你設定的規則決定出三個變數 $\text{changed\_color}, \text{changed\_state}$ 以及 $\text{action}$,並依序進行以下事項:
現在請幫機器人設定好規則,在使用至多 $k$ 種顏色且身上所顯示的數字至多為 $40$ 的情況下判斷出答案吧!
詳細細節與評分方式請見後續段落。
你的程式需要在一開始使用前置處理器引入 lib1398.h,詳細請參考範例實作。
你需要完成以下的一個函式:
void build(int k);
build 會被呼叫恰一次。k 代表可以使用的顏色上界。你可以呼叫以下函式:
void add_rule(int current_color, int current_state, int wall, int changed_color, int changed_state, int action);
Wrong Answer [1]。Wrong Answer [2]。當 build 函式成功結束後,評測系統會開始模擬 $t$ 個測試資料,若模擬中遇到了以下情況之一,模擬就會停止且回傳對應的 Wrong Answer 結果:
Wrong Answer [3]。Wrong Answer [4]。Wrong Answer [5]。Wrong Answer [6],其中 $n$ 為目前測資的磁磚數量。注意到你不會事先得知 $n$ 的大小。Wrong Answer [7]。若對於每一種磁磚機器人都順利判斷出正確的答案,那你的程式將依照 Scoring 中的敘述評分。
| 評測程式端 | 參賽者程式端 |
|---|---|
呼叫 build(3)。 | |
呼叫 add_rule(1, 1, 1, 1, 1, 4)。 | |
呼叫 add_rule(2, 1, 1, 1, 1, 5)。 |
add_rule 中 $\text{current\_state}$ 的最大值,則會按照以下方式給分:
| $S$ | $\leq 3$ | $4$ | $5$ | $6$ | $7$ | $8$ | $9$ | $10$ | $11$ | $12$ | $13$ | $14$ | $15$ | $16$ |
| 分數 | $45$ | $40$ | $35$ | $30$ | $28$ | $26$ | $24$ | $22$ | $20$ | $19$ | $18$ | $17$ | $16$ | $15$ |
| $S$ | $\leq 3$ | $4$ | $5$ | $6$ | $7$ | $8$ | $9$ |
| 分數 | $55$ | $45$ | $25$ | $16$ | $12$ | $8$ | $4$ |
範例評分程式以下列方式輸入:
首先第一行輸入一個正整數 $k$,代表可以使用的顏色數量,接下來第二行輸入一個正整數 $t$,代表測試資料的數量。接下來每筆測試資料都以下列格式輸入:
其中 $n$ 為磁磚的數量,$a_i$ 為第 $i$ 塊磁磚的初始顏色。
範例評分程式會以下列方式輸出:
若你在過程中獲得 Wrong Answer [x],那範例評分程式會輸出相同的文字並直接結束。否則會在第一行輸出 Accepted: m,其中 $m$ 為你所有呼叫的 add_rule 中 $\text{current\_state}$ 的最大值。
另外,在模擬的過程中,範例評分程式會輸出每一步的流程。若不想要輸出完整的流程只要將 grader.cpp 中第 8 行的 #define DETAILED 移除即可。
3 3 4 1 1 2 2 6 1 1 2 1 2 2 6 1 2 2 1 1 2
Accepted: 3
由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。
parentheses.exe,請直接用命令列執行該檔案。#include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。| No. | Testdata Range | Constraints | Score |
|---|---|---|---|
| 1 | 0 | 範例測資 | 0 |
| 2 | 0~30 | $k = 3$ | 45 |
| 3 | 31~60 | $k = 2$ | 55 |