翻轉遊戲(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 步長為選取間隔正負整數均可,預設步長...