小樂樂搭積木(深搜)
阿新 • • 發佈:2018-12-06
連結:https://ac.nowcoder.com/acm/contest/301/B
來源:牛客網
題目描述
小樂樂想要給自己搭建一個積木城堡。
積木城堡我們假設為n*m的平面矩形。
小樂樂現在手裡有1*2,2*1兩種地磚。
小樂樂想知道自己有多少種組合方案。
輸入描述:
第一行輸入整數n,m。(1<=n,m<=10)
輸出描述:
輸出組合方案數。
示例1
輸入
2 3
輸出
3
說明
示例2
輸入
1 3
輸出
0
示例3
輸入
2 5
輸出
8
題意:略
題解:想象成豎著的平面矩形,然後詳細看程式碼;
#include <iostream> #include <cstring> using namespace std; const int MAX = 20; bool vis[MAX][MAX]; int mv[2][2]={0,1,1,0};//加的木塊只有在原木塊的上面或者右面; int ans,n,m;//n是寬m是長 void dfs(int area){ if(area==n*m){ ans++; return; } int x=area/n; int y=area%n; if(vis[x][y]) return dfs(area+1);//因為是 2*1 1*2的木塊 vis[x][y]=true; for (int i = 0; i < 2;i++){ int xx=x+mv[i][0]; int yy=y+mv[i][1]; if(xx<m&&yy<n&&!vis[xx][yy]){ vis[xx][yy]=1; dfs(area+1); vis[xx][yy]=0; } } vis[x][y]=0; return; } int main(){ cin >> n >> m; if((n*m)&1){ cout << 0 << endl; return 0; } dfs(0); cout << ans << endl; //memset(vis,0,sizeof(vis)); // ans=0; return 0; }