畫家問題:
總時間限制:
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...