畫家問題和撥鐘問題 列舉法 舉例

2021-06-21 23:11:47 字數 1600 閱讀 8338

畫家問題:

總時間限制: 

1000ms 

記憶體限制: 

65536kb

描述 有乙個正方形的牆,由n*n個正方形的磚組成,其中一些磚是白色的,另外一些磚是黃色的。bob是個畫家,想把全部的磚都塗成黃色。但他的畫筆不好使。當他用畫筆塗畫第(i, j)個位置的磚時, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的磚都會改變顏色。請你幫助bob計算出最少需要塗畫多少塊磚,才能使所有磚的顏色都變成黃色。

輸入第一行是個整數t(1≤t ≤20),表示要測試的案例數。然後是t個案例。每個案例的首行是乙個整數n (1≤n ≤15),表示牆的大小。接下來的n行表示牆的初始狀態。每一行包含n個字元。第i行的第j個字元表示位於位置(i,j)上的磚的顏色。「w」表示白磚,「y」表示黃磚。

輸出每個案例輸出一行。如果bob能夠將所有的磚都塗成黃色,則輸出最少需要塗畫的磚數,否則輸出「inf」。

樣例輸入

2 

3 yyy

yyy

yyy

5wwwww

wwwww

wwwww

wwwww

wwwww

樣例輸出

0 

15

**

1681

有些像點燈問題,解法也是利用了點燈問題中第一行的選擇決定下一行的選擇。所以只需要列舉出第一行所有的可能,以及驗證最後一行是否正確,**

#include #include #include #include using namespace std;

// 畫家問題 列舉法

// press 和 paint 的 關 系

// 這一格該不該畫 與 此格的情況 和 周圍按下的情況有關

// 簡化計算,根據 press 第一行來判斷後面的是否要按下

int draw[30][30];

int paint[30][30];

string label;

int guess(int n, int b)}}

// 需要判斷最後一行

for(int j = 1; j <= n; j++)

return counter;

}void enumerate(int n)

while (temp--)

}if (*number.begin() == 999999) ;

// 思路 : 窮舉 所有 可能的操作 , 每乙個操作都可以執行3次。

bool isclock(int* a)

return true;

}int main()

if (isclock(a)) }

while(contain[num]>1)

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

*/ for (int i=1;i<=9;++i) }

while (1);

return 0;

}

列舉 撥鐘問題

演算法思路 假設時鐘指標位置對應的值為clock time,那麼順時針旋轉90 就是clock time clock time 1 4 這一組時針就用乙個陣列表示。9種操作對應乙個二維陣列。這一題實質類似熄燈問題和畫家問題。其共通點在於 操作對環境的改變是無序的,每個操作都會影響到周圍的狀態。同時每...

貪心列舉 撥鐘問題

問題描述 有9個時鐘,排成乙個3 3的矩陣。現在需要用最少的移動,將9個時鐘的指標都撥到12點的位置。共允許有9種不同的移動。如右表所示,每個移動會將若干個時鐘的指標沿順時針方向撥動90度。移動 影響的時鐘 1 abde 2 abc 3 bcef 4 adg 5 bdefh 6 cfi 7 degh...

列舉問題 POJ畫家問題

列舉 poj畫家問題 poj 畫家問題 測試 input 3yyy yyyyyy output 0input 5wwwww wwwww wwwww wwwww wwwww output 15 include include using namespace std int min painting b...