題意:有乙個4*4的方格,每個方格中放一粒棋子,這個棋子一面是白色,一面是黑色。遊戲規則為每次任選16顆中的一顆,把選中的這顆以及它四周的棋子一併反過來,當所有的棋子都是同乙個顏色朝上時,遊戲就完成了。現在給定乙個初始狀態,要求輸出能夠完成遊戲所需翻轉的最小次數,如果初始狀態已經達到要求輸出0。如果不可能完成遊戲,輸出impossible。
分析:看完這道題,一種很直觀的想法就是,對給出的初始狀態,由於能進行16種不同的操作(總共16枚棋子),因此就列舉每一種操作後能達到的狀態,看是否滿足題目要求,若不能就繼續進行操作,直到滿足題目條件或判斷出無法完成為止。
剛開始本以為這樣會超時的,畢竟每乙個狀態都能衍生出16個狀態,這樣就相當於乙個16叉樹了。但在網上看了大神的題解後才知道,實際上暴力搜尋是能求解的。。。只是如果每次都用乙個4*4的陣列儲存狀態,不僅空間開不下,而且處理和記錄狀態資訊也很麻煩,因此要用二進位制壓縮狀態。
1:由於每個棋子都是黑色或白色的,因此,可以用0表示白色,1表示黑色,這樣每個棋子就只能處於兩種狀態之一,而整個棋盤可以用乙個16位整數唯一標示。顯然,當棋盤表示0(全白)或65535(全黑)時,遊戲結束。
2:翻轉某個棋子等價於::讓表示它的數字異或1,如0^1=1,1^1=0。這樣,對棋盤的每次操作就轉換為:對標示它的數字按位異或1。例子見**注釋;
3:對每個狀態衍生出的16種狀態,首先判斷其中有沒有全黑或全白的,若沒有就繼續進行衍生。這裡很明顯用佇列儲存狀態。衍生出的狀態依次入隊,但已經出現過的狀態不應再次入隊,因此要用乙個標誌陣列vis對出現的狀態進行標示。這樣,無論是否有解,佇列最終都會為空。
/*
用0表示白色,1表示黑色,每乙個狀態都有乙個16位數唯一標示:
eg: bwwb
bbwb
bwwb
bwww
即可表示為1001 1101 1001 1000,其十進位制值為40344。
對棋盤的每次操作都可以用異或實現。如翻轉左上角第乙個棋子的話,過程如下:
1001 1101 1001 1000 ^ 1100 1000 0000 0000 = 0101 0101 1001 1000 (翻轉後的狀態)
翻轉第二行第二個棋子的話即為:
1001 1101 1001 1000 ^ 0100 1110 0100 0000 = 1101 0011 1101 1000 (翻轉後的狀態)
......
可以看出,翻轉左上角第乙個棋子時異或的 1100 1000 0000 0000 是由 0000 0000 0000 0000 翻轉對應位置所得來的。
翻轉第二行第二個棋子時異或的 0100 1110 0100 0000 是由 0000 0000 0000 0000 翻轉對應位置所得來的。
.......
因此,總共有16個數,每個數都代表乙個操作。當要執行某個操作時,直接異或對應的數就行了。那麼程式中首先就先把這16個數求出來。
*/#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef pairpii;
const int m=1010;
const int n=100010;
int n,m,change[16];
int d[4][2]=;
char s[m][m];
bool vis[n];
struct node
;void init() // 求出代表操作的16個數,儲存在陣列change裡。
}change[e++]=t; //coutq.push(t);
vis[temp]=true;
while(!q.empty())
}return -1;
}int main()
}
POJ1753 棋盤翻轉(位壓縮 廣度優先搜尋)
題目大意 有乙個4 4的方格,每個方格中放一粒棋子,這個棋子一面是白色,一面是黑色。遊戲規則為每次任選16顆中的一顆,把選中的這顆以及它四周的棋子一併反過來,當所有的棋子都是同乙個顏色朝上時,遊戲就完成了。現在給定乙個初始狀態,要求輸出能夠完成遊戲所需翻轉的最小次數,如果初始狀態已經達到要求輸出0。...
廣度搜尋 POJ 1753
題意 乙個4 4的棋盤,每個格仔放著乙個棋子。棋子一面是白色,一面是黑色。一次操作可以將某乙個格仔以及上下左右共5個格仔的棋子都翻過來,即白色變黑色,黑色變白色。現在給出一種棋盤狀態,問最少需要幾次操作可以將棋盤全部變為同種顏色。輸入 sample input bwwb bbwb bwwb bwww...
poj1753 搜尋,列舉法
1 2014.3.1 2 poj175334 5 題意 6 給你乙個4 4的黑白棋盤,通過翻棋子使棋盤變為全白或全黑,7 以下 翻乙個位置 皆指翻著個位置和它周圍的四個棋子。8 翻子時四周的四個棋子如果存在的話顏色也會跟著改變。9 問最少需要多少步可以使棋盤變為一種顏色。10 11 思路 12 每一...