列舉 撥鐘問題

2021-07-16 02:50:00 字數 1490 閱讀 9856

演算法思路:

假設時鐘指標位置對應的值為clock_time,那麼順時針旋轉90°就是clock_time = (clock_time+1)%4    這一組時針就用乙個陣列表示。9種操作對應乙個二維陣列。

這一題實質類似熄燈問題和畫家問題。其共通點在於:操作對環境的改變是無序的,每個操作都會影響到周圍的狀態。同時每一種操作都有週期性限制,也即最多需要幾次操作,多於這個次數產生迴圈。

熄燈問題中,每個燈最多熄燈一次,因為燈只有兩種狀態,並且迴圈。而這裡,有4種迴圈的狀態,因此每個移動操作頂多使用3次。

我們對移動方法1,2,3進行列舉,每種方法無非實施0-3次,也即一共4^3=64種情況。這些情況之間並非沒有關係。例如,我們確定了1,2,3的情況數,那麼得到乙個燈a,b,c的狀態,而只有移動4能夠改變a,移動5能夠改變b,移動6能夠改變c,那麼移動4-6的次數也確定了。同樣,這時只有移動7能夠改變d,移動9能夠改變f,這時移動7和9的次數也確定了。最後,時鐘a,b,c,d,f都已經到達12點,e,g,h,i還沒確定,只剩下移動8能夠改變ghi,所以只要檢查e是否已經到達12點以及,ghi的時鐘數是否相等就行了。最後找到乙個移動次數最小的情況。

這題也可以用暴力搜尋,因為最多有4^9個組合,不會超時。

這題還可以列出乙個方程組,九個未知數,通過高斯消元法來解方程組。

**:#include

#include

#include

using namespace std;

int initial_clocks[10]=, adjusted_clocks[10]=, op[10]=;

vectorperfect_adjust;

const int operations[10][10] =

,//  a  b  c  d  e  f  g  h  i

,  //op1: abde

,  //op2: abc

,  //op3: bcef

,  //op4: adg

,  //op5: bdefh

,  //op6: cfi

,  //op7: degh

,  //op8: ghi

//op9: efhi

};/*

調整時鐘:

引數:op_num:調整方式(9種)

op_counts:操作次數

*/void operate(int op_num, int op_counts)

}int guess()

return steps;

}return 101;

}int enumerate()

if (enumerate()<101)

}return 0;

}

貪心列舉 撥鐘問題

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

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

畫家問題 總時間限制 1000ms 記憶體限制 65536kb 描述 有乙個正方形的牆,由n n個正方形的磚組成,其中一些磚是白色的,另外一些磚是黃色的。bob是個畫家,想把全部的磚都塗成黃色。但他的畫筆不好使。當他用畫筆塗畫第 i,j 個位置的磚時,位置 i 1,j i 1,j i,j 1 i,j...

poj2814 撥鐘問題 C語言 列舉演算法

include include 首先,我們考慮用長度為9的陣列表示表盤的狀態以及調表的操作,終止的條件是表盤狀態陣列所有元素模4為0 如果一種操作使用超過4次,那麼相當於沒有操作,所以運算元組需要多出一位記錄造作使用的次數,乙個操作最多使用3次 特別是我們注意到這個題沒有問操作的順序,所以操作的前後...