1.演算法
核心是寬度優先搜尋和位處理。要找出最快的步數,用寬搜。
(1)寬度優先搜尋資料結構:
佇列的單元unit包含x(用int的末16位記錄16個位置的資訊),rounds(記錄第幾輪達到當前的狀態),i(記錄該狀態是通過翻動哪個棋子得來的,以避免返回先前的狀態)。queue是乙個佇列,記錄所有狀態;p,q分別是佇列的頭尾指標。used記錄已經存在的狀態。
(2)寬度優先搜尋演算法處理:
a.首先是讀入資料。
b.進行寬度搜尋,直到找到結果,或者佇列中沒有元素(此時為impossible)。
c.flip函式是從a狀態通過翻動第i個棋子到達b狀態。
d.在得到乙個新狀態的時候要檢驗之前時候存在這個狀態,如果存在就把這個狀態捨棄,即q--;
2.實現
(1)閱讀**的時候,不能scanf("%c")讀取到每乙個字元,因為讀取字元的時候會讀到"\n",或許還會有其他的字元。通過讀取string能夠解決這個問題。
(2)通過位操作可以a.減少記憶體b.可以對16位單獨操作,也可以對整體進行操作。
(3)在查詢某狀態是否與之前狀態有重疊時可以通過陣列下標進行操作,這樣速度較快。
(4)獲取乙個int某位用該int與(0x1<
struct unit ;
void flip(unit a, int n, unit& b);
int main() ;
/*read in*/
char str[10];
for (int i = 0; i < 4; i++) }}
/*search*/
while (!((queue[q].x == 0) || (queue[q].x == 0xffff)))
if (p == q)
p++;
}if ((queue[q].x == 0) || (queue[q].x == 0xffff))
printf("%d\n", queue[q].rounds);
return 0;
}void flip(unit a, int n, unit& b)
poj1753解題報告(列舉 組合數)
poj 1753,題目鏈結 有4 4 的正方形,每個格仔要麼是黑色,要麼是白色,當把乙個格仔的顏色改變 黑 白或者白 黑 時,其周圍上下左右 如果存在的話 的格仔的顏色也被反轉,問至少反轉幾個格仔可以使 4 4的正方形變為純白或者純黑?1.每乙個位置只有兩種顏色,翻偶數次等於沒有翻,所以只有翻基數次...
廣度搜尋 POJ 1753
題意 乙個4 4的棋盤,每個格仔放著乙個棋子。棋子一面是白色,一面是黑色。一次操作可以將某乙個格仔以及上下左右共5個格仔的棋子都翻過來,即白色變黑色,黑色變白色。現在給出一種棋盤狀態,問最少需要幾次操作可以將棋盤全部變為同種顏色。輸入 sample input bwwb bbwb bwwb bwww...
Poj1753 翻轉棋子
這個題就是用列舉舉遍所有情況,然後乙個乙個深搜看看是不是符合條件,符合條件直接退出,不符合則繼續,由於 只有16個所以可以得知最多的步數只能是16,所以可以根據步數從0到16依次列舉,第乙個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜,和測試資料如下...