有排成一行的n個方格,用紅(red)、粉(pink)、綠(green)三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法
1、遞迴演算法
我們先不管第一格到第三格怎麼塗色,我們先考慮倒數第2格,也就是第n-1格怎麼塗色?
根據題意,
a、如果這個方格的顏色和第乙個方格的顏色不同,那麼第n個方格就只有1種選擇(因為首尾兩格也不同色),所以之前n-1個方格的塗色方法為paint(n-1),此時n個方格的塗色方法總數為paint(n-1)*1;(將第n個方格和之前的方格分成兩部分)
b、如果這個方格的顏色和第乙個方格的顏色相同,那麼第n個方格就有2種選擇,所以之前n-1個方格的塗色方法為paint(n-2)(為什麼是n-2呢?是因為前提是——「n-1的方格顏色已與第1個方格的顏色一致,第1個是什麼顏色,第n-1方格就是什麼顏色」,所以n-1方格的顏色不需要考慮,所以函式裡傳的引數是n-2)。所以,在本情況下,n個方格的塗色方法總數為2*paint(n-2)。
上述的a、b是思考方式上的分類,說白了就是初中數學(中考最後一題)中要掌握的分類討論思想---「要想解對題,此題的所有情況都要列出」,而不是我們c語言中,不是if就是else的互斥情況。
綜上,解決塗色問題的表示式是:方法總數=paint(n-1)*1+2*paint(n-2)
int paint(intn)
2、動態規劃
#include usingnamespace
std;
intmain()
cin >>n;
cout
}
RPG塗色難題
有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色 求全部的滿足要求的塗法.以上就是著名的rpg難題.假設要填第n格,那麼有兩種情況 1.第n 1格和第一格不同顏色 2.第n 1格和第一格相同顏色。情況1 塗好...
遞推和遞迴 RPG難題
人稱 ac女之殺手 的超級偶像lele最近忽然玩起了深沉,這可急壞了眾多 cole lele的粉絲,即 可樂 經過多方打探,某資深cole終於知道了原因,原來,lele最近研究起了著名的rpg難題 有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何...
遞推和遞迴 RPG難題
人稱 ac女之殺手 的超級偶像lele最近忽然玩起了深沉,這可急壞了眾多 cole lele的粉絲,即 可樂 經過多方打探,某資深cole終於知道了原因,原來,lele最近研究起了著名的rpg難題 有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何...