poj 1753 位壓縮 搜尋

2021-06-28 04:08:21 字數 1902 閱讀 9101

題意:有乙個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 每一...