Poj1753 翻轉棋子

2022-06-30 01:36:14 字數 1000 閱讀 9559

這個題就是用列舉舉遍所有情況,然後乙個乙個深搜看看是不是符合條件,符合條件直接退出,不符合則繼續,

由於**只有16個所以可以得知最多的步數只能是16,所以可以根據步數從0到16依次列舉,

第乙個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜,

**和測試資料如下:

#includeint

flag;

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。...