這個題就是用列舉舉遍所有情況,然後乙個乙個深搜看看是不是符合條件,符合條件直接退出,不符合則繼續,
由於**只有16個所以可以得知最多的步數只能是16,所以可以根據步數從0到16依次列舉,
第乙個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜,
**和測試資料如下:
#includeintflag;
intstep;
int map[4][4
];void turn(int i, int j) //
轉換
if (i < 3
)
if (j > 0
)
if (j < 3
)
}int range()//
判定**是否全部一樣}}
return1;
}int dfs(int i, int j, int dp)//
深搜(dp<=step)
if (flag || i == 4
)
//沒有以上兩種可以直接退出函式的情況,
//說明此時的dpturn(i, j);
//對第dp+1次的轉換進行判斷
if (j < 3
)
else
turn(i, j);
//不符合條件,重新轉換回來
//第dp次時,**恢復初始狀態
if (j < 3
)
else
return0;
}int
main()
else
}getchar();
//不要遺忘
}
for (step = 0; step <= 16; step++)
if(flag)
else
return0;
}
廣度搜尋 POJ 1753
題意 乙個4 4的棋盤,每個格仔放著乙個棋子。棋子一面是白色,一面是黑色。一次操作可以將某乙個格仔以及上下左右共5個格仔的棋子都翻過來,即白色變黑色,黑色變白色。現在給出一種棋盤狀態,問最少需要幾次操作可以將棋盤全部變為同種顏色。輸入 sample input bwwb bbwb bwwb bwww...
poj1753解題報告
1.演算法 核心是寬度優先搜尋和位處理。要找出最快的步數,用寬搜。1 寬度優先搜尋資料結構 佇列的單元unit包含x 用int的末16位記錄16個位置的資訊 rounds 記錄第幾輪達到當前的狀態 i 記錄該狀態是通過翻動哪個棋子得來的,以避免返回先前的狀態 queue是乙個佇列,記錄所有狀態 p,...
POJ1753 棋盤翻轉(位壓縮 廣度優先搜尋)
題目大意 有乙個4 4的方格,每個方格中放一粒棋子,這個棋子一面是白色,一面是黑色。遊戲規則為每次任選16顆中的一顆,把選中的這顆以及它四周的棋子一併反過來,當所有的棋子都是同乙個顏色朝上時,遊戲就完成了。現在給定乙個初始狀態,要求輸出能夠完成遊戲所需翻轉的最小次數,如果初始狀態已經達到要求輸出0。...