思路:列出前面幾項觀察下規律, a[1] = 3, a[2] = 6, a[3] = 6;
按照一般的思路,找塗n個方格的方法數,可以看塗n-1個方格的方法數,然後塗第n個方格多了多少種方法
根據題中“要求任何相鄰的方格不能同色,且首尾兩格也不同色 ”可知
當n大於等於4時,第1格到第n-1格(大於等於3)纔不是相鄰的
思路來源:塗好了前n-1格的基礎上塗第n格,保證第1格和第n格顏色不同,且第n-1格與第n格顏色不同
所以需要去分類討論第1格和第n-1格的顏色是否相同
所以得到一個討論的條件:(當n大於等於4時)(總共有3種顏色)
1.第1格與第n-1格同色時,塗第n格可以有2種方法,此時滿足第1格與第n格顏色不同,第n-1格與第n格顏色不同
而此時塗前n-1格的方法數實際上只是塗前n-2格的方法數(第1格與第n-1格同色),所以有2*a[n-2]種方法。
2.第1格與第n-1格不同色時,塗第n格只能有1種方法,此時滿足第1格與第n格顏色不同,第n-1格與第n格顏色不同
而此時塗前n-1格的方法數爲a[n-1]
所以塗前n格的方法數爲a[n]=a[n-1]+2*a[n-2]
所以第一種爲2*a[i-2]
2.當n=1與n=n-1不同,那麼而此時塗前n-1格的方法數爲a[n-1];
AC代碼:
#include <iostream>
using namespace std;
int main(){
long long a[60];//用long long存取,因爲當n較大時數會很大,保險起見
int n;
a[1] = 3;
a[2] = 6;
a[3] = 6;
while(cin >> n){
for(int i = 4; i <= n; i++){
a[i] = a[i - 1] + 2*a[i - 2];
}
cout << a[n] << endl;
}
return 0;
}