1. 程式人生 > >小樂樂搭積木(深搜)

小樂樂搭積木(深搜)

連結: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;
}