Flip Game poj1753 陣列的列舉

2021-06-17 14:54:41 字數 817 閱讀 2146

題目:

思路1:0ms

1)遞迴列舉第一行,16種情況;

3)一旦第一行16種情況的其中一種形成,則下面的翻轉情況就唯一確定了,所以列舉量為16;

4)最後檢查最後一行是否全『b』或全『w』來判斷滿不滿足全『b』或全『w』。

思路2:

還可使用高斯消元法做

#include #include #define inf 20

int cnt1;

char anti(char c)

void digui(char arr[5],int cnt,int cur)

}} flag=0;

for(i=0;i<4;i++)

if(flag==0)

}}

flag=0;

for(i=0;i<4;i++)

if(flag==0)

else

}return; }}

int main()

int sum=0;

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

if(arr[i][j]=='w')

sum+=1;

if(sum==0 || sum==16)

cnt1=inf;

digui(arr,0,0);

if(cnt1==inf)

printf("impossible\n");

else

printf("%d\n",cnt1);

return 0;

}

廣度搜尋 POJ 1753

題意 乙個4 4的棋盤,每個格仔放著乙個棋子。棋子一面是白色,一面是黑色。一次操作可以將某乙個格仔以及上下左右共5個格仔的棋子都翻過來,即白色變黑色,黑色變白色。現在給出一種棋盤狀態,問最少需要幾次操作可以將棋盤全部變為同種顏色。輸入 sample input bwwb bbwb bwwb bwww...

poj1753解題報告

1.演算法 核心是寬度優先搜尋和位處理。要找出最快的步數,用寬搜。1 寬度優先搜尋資料結構 佇列的單元unit包含x 用int的末16位記錄16個位置的資訊 rounds 記錄第幾輪達到當前的狀態 i 記錄該狀態是通過翻動哪個棋子得來的,以避免返回先前的狀態 queue是乙個佇列,記錄所有狀態 p,...

Poj1753 翻轉棋子

這個題就是用列舉舉遍所有情況,然後乙個乙個深搜看看是不是符合條件,符合條件直接退出,不符合則繼續,由於 只有16個所以可以得知最多的步數只能是16,所以可以根據步數從0到16依次列舉,第乙個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜,和測試資料如下...