2018寒假集訓 Day1 位運算 翻轉遊戲

2021-08-15 07:22:57 字數 1728 閱讀 6890

翻轉遊戲(flip)

【問題描述】

翻轉遊戲是在乙個 4 格×4 格的長方形上進行的,在長方形的 16 個格上每

個格仔都放著乙個雙面的物件。每個物件的兩個面,一面是白色,另一面是黑色,

每個物件要麼白色朝上,要麼黑色朝上,每一輪你只能翻 3 至 5 個物件,從而由

黑到白的改變這些物件上面的顏色,反之亦然。每一輪被選擇翻轉的物件遵循以

下規則:

1、從 16 個物件中任選乙個。

2、翻轉所選擇的物件的同時,所有與它相鄰的左方物件、右方物件、上方物件

和下方物件(如果有的話),都要跟著翻轉。

以下為例:

bwbw

wwww

bbwb

bwwb

這裡」b」表示該格仔放的物件黑色面朝上、」w」表示該格仔放的物件白色朝

上。如果我們選擇翻轉第三行的第乙個物件(如圖所示),那麼格仔狀態將變為:

bwbw

bwww

wwwb

wwwb

遊戲的目標是翻轉到所有的物件白色朝上或黑色朝上。你的任務就是寫乙個

程式來求最少的翻轉次數來實現這一目標。

【輸入格式】flip.in

輸入檔案包含 4 行,每行 4 個字元,每個字元」w」 或 「b」表示遊戲開始時格仔

上物件的狀態。

【輸出格式】flip.out

輸出檔案僅乙個整數,即從給定狀態到實現這一任務的最少翻轉次數。如果給定

的狀態就已經實現了目標就輸出 0,如果不可能實現目標就輸出」impossible」。

【輸入樣例】

bwwb

bbwb

bwwb

bwww

【輸出樣例】

4 【解題思路】

把黑白當作01,把圖每一行相接形成一行,轉換成01串後化成十進位制。

用bfs對每乙個點進行翻轉,從乙個圖可以拓展出16種狀態,接著繼續拓展。

而對每乙個點的翻轉操作,可以利用位運算中的異或運算。

依照參考程式中的做法,對左上角的翻轉操作就是異或19,對右下角的翻轉操作就是異或51200。

計算方法就是把要翻轉的位置當作是1,別的位置當作是0,按照開頭的方法轉化成01串後轉化成10進製。

【參考程式】

#include

#include

#include

using

namespace

std;

int num;

string st,sr;

bool visit[65536];

struct data

que[65536];

int trans(string st)//b當作是1,w當作是0,轉換成十進位制整數

return ans;

}const

int table[16]=;//打表

int bfs(int num)

int head=0,tail=1;

que[head].pic=num;que[head].step=0;

visit[num]=true;

while (headfor (int i=0;i<16;i++)//拓展

tail++;}}

head++;

}return -1;

}int main()

2018寒假福州集訓記Day1

哦 今天上午直接一波考試。之前1個月都在準備期末考試,資訊書都沒翻過,考試前臨時抱佛腳,然而並沒啥卵用。好了不談了,說說題目吧。t1是一道dp題目 我考完試才知道,考試的時候我也有想過可能與遞推有關 題目給的樣例剛好是兩種極端的情況,一種是每行語句下面都加乙個printf再編譯一遍,另一種是一直二分...

寒假集訓系列DAY 1

problem a.string master master.c cpp pas 題目描述 所謂最長公共子串,比如串 a abcde 串 b jcdkl 則它們的最長公共子串為串 cd 即長 度最長的字串,且在兩個串中都作為連續子串出現過。給定兩個長度都為 n 的字串,對於字串大師的你來說,求它們的...

寒假學習day 1

今天學習了python常用的字串操作方法。1.字串的下標 字串的每個組成字元都有對應的下標,如str abc 那麼str 0 a,str 1 b 2.字串的切片 語法 序列 開始位置下標,結束位置下標,步長 注意 1 不包含結束位置下標對應的數,正負整數均可。2 步長為選取間隔正負整數均可,預設步長...