題目:
思路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依次列舉,第乙個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜,和測試資料如下...