直接進入正題,這題要求解的是乙個條件極其寬鬆下的組合題,似乎在看見這題的時候,我們就能遇見這道題的答案會是多麼的龐大,所以題中也才會有 % 9937 這樣的提示。對於如此大的乙個運算,只走一步的話還好辦,有9種情況,(順時針和逆時針旋轉2次加上相鄰兩個交換位置(交換一對的4次,交換兩對的2次)最後加上原地不動的1次),就1次就夠麻煩的,計算結果表明,兩步共有633種可能, 足以見得後面的情況是多麼的複雜。
假設布局如下(上面依次站著a, b, c, d號機械人):
"0" -a "1" -b
"2" -c "3" -d
那麼對於剛開始位於 "0" 的 a 機械人來說,此時它位於 "0" 的方案數為 1, 位於其他三個區域的方案數為 0,這是顯而易見的,那麼下一時刻呢?是這樣的,此時位於"0"的方案數就變成了 1,位於"1"的方案數為 1,位於"2"的方案數為 1, 位於"3"的方案數為 0。哦,原來是這樣的,就是每次加上跟 "x" 位置相鄰以及本身位置上一步的方案數。
有: dp[n][0] = dp[n-1][0] + dp[n-1][1] + dp[n-1][2]; // 原諒我變數名取了dp,它看起來確實比較順眼
dp[n][1] = dp[n-1][0] + dp[n-1][1] + dp[n-1][3];
dp[n][2] = dp[n-1][0] + dp[n-1][2] + dp[n-1][3];
dp[n][3] = dp[n-1][1] + dp[n-1][2] + dp[n-1][3];
再對初始化位置為 "1", "2", "3" 的機械人進相同的步驟就能夠計算出每個機械人在第n步時,在每乙個區域的方案總數。
做好了上面的準備工作,我們就能夠利用這些資訊來進一步解決這個棘手的問題。那麼我們還是來看最簡單的只走一步來分析它,由於我們已經知道了走了1步後,各個機械人最後在四個位置的方案數有多少種。
好,我們開始來數,首先是順時針旋轉,此時 a 到達了 "1", b到達了 "3", c到達了 "0" , d到達了 "2",恩,這個情況出現了,於是我們要去找了,到第 n = 1 步的資料中尋找a在"1"有多少種方案,依次 n = 1時 b在"3",c在"0",d在"2"的方案數。將他們相乘即得到這種終態下的方案數。接下來就是剩下8種狀態對應的方案數了。在n = 1步中這些方案總數都是1種。
但是新的問題又出來了,難道我要把每一步的所有可能的情況都推算出來嗎,其實這裡有個蠻力的法子,就是把所有可能的終態都計算一遍,大不了就是多加幾個零唄。我們可以推算出終態總數為24種,也即4!。
這樣分析完之後,題目就有可解性了。動手吧。
**如下:
1 #include2 #include
3 #include
4 #include
5 #include
6 #include
7using
namespace std;89
struct statu
10 a[4]; //
四個機械人的位置資訊
1314
void deal( void )
15 25 }
26 }
2728
int slove( int n )
29 ;
31for( int i = 0; i < 24; ++i )
32
41return sum;
42 }
4344
int main()
45 50
51 deal();
5253
int n;
54while( scanf( "
%d", &n ) != eof )
55
5859
return
0;60 }
遞推 機械人走格仔
題目 有乙個x y的網格,乙個機械人只能走格點且只能向下走或向右走,要從左上角走到左下角,求有多少總走法。該題可以直接使用遞迴,也可以著遞推公式,但感覺遞迴的效能沒有遞推的好,但自我感覺遞推的思路相對較難,規律較為難找。遞迴 public static intrecursion int x,int ...
HDOJ 2238 機械人的舞蹈II
清明去鄉下掃了一圈墓 回來把這題a了.首先說一下這題和hdoj 2232的區別.這道題描述上和2232的區別就是本題的機械人是一樣的.2232裡的機械人是不同的.那麼造成的區別在於轉移的時候差別.如有 4 0 2 2 1,2 3,4 1,3 2,4 0 0 0 0 如果是不同機械人.那麼 0 0 與...
好色機械人的豔遇 機械人豔遇 《機械人的旅行》
講述機械人 路遇開房車的 剛剛開始的時候畫風很舒服,直到到了晚上上了她的床之後。畫風速變了!這個女主角聲音超好聽。整個情節實在太流氓了,太猥瑣了!連六六君這樣的老司機都看不下去了!正片在三分五十,不謝 很抱歉,此內容已經失效了!就連六六君也無法恢復了。請欣賞其他有效的內容 當您看到這條資訊的時候,很...