HDOJ-2501-Tiling_easy version

这题很水,但还是写一下。主要是写下怎么找规律

找规律的话,如果有耐心,可以拿只笔一个个的画下(但我不保证不会失误),

另外就是写程序模拟一下。这题用的是dfs

每次添加有3中情况

a) 添加一块2x1的

b) 添加一块2x2的

c) 添加两块2x1的,横放,与3块2x1的区别开

然后搜索,每得到一次结果记录一下。

下面是代码

这里找了前20组,本来想全部找出来的,课程序吃不消

#include <cstdio> __int64 cnt; int i, j; void dfs(int sum){ if(sum == i){ cnt++; return ; } if(sum > i) return ; for(int k = 1; k <= 3; k++){ if(k == 1) dfs(sum+1); else dfs(sum + 2); } } int main(){ __int64 ans[31]; for(i = 1; i < 20; i++){ cnt = 0; for(j = 1; j <= 3; j++){ if(j == 1) dfs(1); else dfs(2); } ans[i] = cnt; } for(i = 1; i < 20; i++) printf("%I64d/n",ans[i]); return 0; }

 

得出的结果很好判断,ans[i] = ans[i-1]*2 + flag  (flag在-1 和1 之间交替出现)

1 3 5 11 21 43 85 171 341 683 1365 2731 5461 10923 21845 43691 87381 174763 349525 699051 1398101 2796203

你可能感兴趣的:(HDOJ-2501-Tiling_easy version)