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; }
相关文章推荐
- 【EOJ 3297. 铺瓷砖】(dfs,记忆化)
- EOJ 1816 判断图连通的三种方法——dfs,bfs,并查集
- eoj 3279 爱狗狗的两个dalao(dfs)
- 蓝桥杯 瓷砖铺放(dfs)
- EOJ - 13 dfs
- EOJ 3260 袋鼠妈妈找孩子 (DFS)
- eoj1120 dfs
- EOJ 1148 质数阵 dfs
- EOJ 2527 Fj & haozi【dfs】
- EOJ 2832:ZERO(DFS)
- EOJ1154 CAN YOU DFS? IDA*搜索算法
- 【EOJ 3260. 袋鼠妈妈找孩子】(dfs,构造)
- EOJ 1154:Can you do DFS? (IDA*)
- EOJ 3260 袋鼠妈妈找孩子(dfs路径查找(过程优化))
- 红黑瓷砖--dfs求解
- BFS和DFS
- UVA 208 Firetruck(DFS)
- poj 3256 Cow Picnic (dfs)
- zoj 1008 dfs 一种巧妙的剪枝
- DFS 转弯数剪枝 hdu 1728