您的位置:首页 > 其它

EOJ 3297 铺瓷砖(DFS)

2017-09-09 14:29 351 查看

题目

http://acm.ecnu.edu.cn/problem/3297/

题意:

有一长度为 N(N≤30) 的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。要求将地板铺满,且任意两个相邻的瓷砖长度均不等。

求一共有多少种铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?

解题思路

在DFS的过程中,用参数n表示剩余地板长度,pre表示前一块瓷砖的长度,usedOne表示走到当前所使用的长度为1的瓷砖块数。

遍历三种长度的瓷砖,如果满足该瓷砖与前一块的长度不同且还铺得下,则铺下这块瓷砖,再者,如果铺下的这块瓷砖长度为1,则usedOne加1后再继续DFS。

AC代码

#include <bits/stdc++.h>
using namespace std;

int total_cnt = 0, one_cnt = 0;

//n表示剩余长度,pre表示前一个瓷砖长度,usedOne表示目前为止用了长度为1的瓷砖的个数
void dfs(int n, int pre, int usedOne)
{
if(n == 0) //铺完
{
total_cnt++;
one_cnt += usedOne;
return;
}
for (int i = 1; i <= 3; ++i)
{
if(i != pre && n >= i) //与前一个瓷砖不同且铺得下
{
if(i == 1) //使用长度为1的瓷砖
dfs(n-i, i, usedOne+1);
else //用长度为2或3的瓷砖
dfs(n-i, i, usedOne);
}
}
}

int main()
{
int T, n;
cin >> T;
while(T--)
{
cin >> n;
total_cnt = one_cnt = 0;
dfs(n, 0, 0);
cout << total_cnt << endl << one_cnt << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: