本題為互動題 僅可使用C++ 14/17/20作答
給你一個 $2\times2$ 的魔術方塊,你可以幫我解開嗎?
上圖為一個 $2\times2$ 的魔術方塊展開圖。每個面都是由 $2\times2$ 個格子所組成。上述圖片當中的魔方已經被解開,我們可以以下列文字表式期六個面的顏色與分佈。(W: White, Y: Yellow, G: green, B: blue, O: Orange, R: Red, -
則表示沒格子的空地)
--WW----
--WW----
OOGGRRBB
OOGGRRBB
--YY----
--YY----
而給你打亂的魔術方塊則如下所示:
--WR----
--WG----
GGRYRBWO
OOGYRBWB
--YB----
--YO----
現在,定義三種旋轉公式符號
若為反方向旋轉,在一班公式裡,會記為如U'
的形式。但在本題中,為了輸出方便,請以小寫字母代替。
已知,利用上述三種旋轉方式,便可以將一顆魔術方塊解開。
現在,給你一顆隨機打亂的魔術方塊,你可以用程式將它解開嗎?
魔術方塊教學:
https://1hrbld.tw/intermediate-selection-panel/222-basicmethod-toturial/
https://ruwix.com/online-puzzle-simulators/2x2x2-pocket-cube-simulator.php
本題為互動題,請不要輸入/輸出任何資料,以免發生無法預期的錯誤。
請在你程式當中,加上一行:
#include "lib4555.h"
在此標頭檔當中,你可以使用一個class及以下二個函數。
class PocketCube {
friend std::ostream& operator<<(std::ostream& os, const PocketCube& p);
public:
PocketCube();
PocketCube& Rotate(char dir);
//上面的函數會幫你旋轉魔方 旋轉方式如下rotate函數所述
bool check();
//這個函數會回傳這個魔方目前是不是對的的布林值
char color[25];
//儲存格子顏色的 代碼編號如下述
};
--0 1----
--2 3----
4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19
--20 21----
--22 23----
PocketCube initialize();
請在你的主程式的最一開始呼叫這個函數。
他會給你一個PocketCube物件
你可以任意呼叫大寫開頭的Rotate函數,其意義為對這個PocketCube物件的color陣列進行操作,不記入旋轉次數也不會影響你的解
void rotate(char dir);
本函數非class中所包含的函數,呼叫他便代表對judge中的魔方進行旋轉且無法復原,請小心呼叫
dir 須為 F
R
U
f
r
u
其中之一,旋轉方向如題目所述
void report();
本函數只能呼叫一次,代表你覺得你的魔方轉對了。
void report();
請呼叫此函數一次,代表你覺得你的魔方轉對了。
這裡有一個可以編譯過但不保證AC的程式
#include<iostream>
#include"lib4555.h"
using namespace std;
int main(){
PocketCube ans;
ans=initialize();
rotate('U');
ans.Rotate('U');
if(ans.check())report();
}
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0~9 | all | 1 |