2010杭州赛区网络预赛 1007 Tetris(DFS)
2010-09-20 20:30
309 查看
这个题其实没有什么特别的技巧,就是直接DFS就行了,至于时间嘛,按一般的DFS都不会超时。
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3647 这里还可以提交
这个题只要细心就没有多大的问题,要把所有的情况都考虑进去。
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3647 这里还可以提交
这个题只要细心就没有多大的问题,要把所有的情况都考虑进去。
// 1007 mnlm 1.0 #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> using namespace std; int n, m; char s[10]; // 积木下降的类型 int h[41]; // 储存现有状态,h[i]表示第i列的高度 bool DFS(int k) { int i; if (k == 10) { return true; } switch (s[k]) { case 'I': for (i = 0; i < n; i++) { if (h[i] + 4 <= m) { h[i] += 4; if (DFS(k + 1)) { return true; } h[i] -= 4; } if (i + 3 < n && h[i] < m && h[i] == h[i + 1] && h[i + 1] == h[i + 2] && h[i + 2] == h[i + 3]) { h[i]++; h[i + 1]++; h[i + 2]++; h[i + 3]++; if (DFS(k + 1)) { return true; } h[i + 3]--; h[i + 2]--; h[i + 1]--; h[i]--; } } break; case 'L': for (i = 0; i < n - 1; i++) { if (h[i]+ 3 <= m && h[i] == h[i + 1]) { h[i] += 3; h[i + 1]++; if (DFS(k + 1)) { return true; } h[i + 1]--; h[i] -= 3; } if (h[i + 1] + 3 <= m && h[i] == h[i + 1] + 2) { h[i]++; h[i + 1] += 3; if (DFS(k + 1)) { return true; } h[i + 1] -= 3; h[i]--; } if (i + 2 < n) { if (h[i] + 2 <= m && h[i] + 1 == h[i + 1] && h[i + 1] == h[i + 2]) { h[i] += 2; h[i + 1]++; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1]--; h[i] -= 2; } if (h[i + 2] + 2 <= m && h[i] == h[i + 1] && h[i + 1] == h[i + 2]) { h[i]++; h[i + 1]++; h[i + 2] += 2; if (DFS(k + 1)) { return true; } h[i + 2] -= 2; h[i + 1]--; h[i]--; } } } break; case 'J': for (i = 0; i < n - 1; i++) { if (h[i + 1] + 3 <= m && h[i] == h[i + 1]) { h[i]++; h[i + 1] += 3; if (DFS(k + 1)) { return true; } h[i + 1] -= 3; h[i]--; } if (h[i] + 3 <= m && h[i] + 2 == h[i + 1]) { h[i] += 3; h[i + 1]++; if (DFS(k + 1)) { return true; } h[i + 1]--; h[i] -= 3; } if (i + 2 < n) { if (h[i] + 2 <= m && h[i] == h[i + 1] && h[i + 1] == h[i + 2]) { h[i] += 2; h[i + 1]++; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1]--; h[i] -= 2; } if (h[i + 2] + 2 <= m && h[i] == h[i + 1] && h[i + 1] == h[i + 2] + 1) { h[i]++; h[i + 1]++; h[i + 2] += 2; if (DFS(k + 1)) { return true; } h[i + 2] -= 2; h[i + 1]--; h[i]--; } } } break; case 'O': for (i = 0; i < n - 1; i++) { if (h[i] + 2 <= m && h[i] == h[i + 1]) { h[i] += 2; h[i + 1] += 2; if (DFS(k + 1)) { return true; } h[i + 1] -= 2; h[i] -= 2; } } break; case 'S': for (i = 0; i < n - 1; i++) { if (h[i] + 2 <= m && h[i] == h[i + 1] + 1) { h[i] += 2; h[i + 1] += 2; if (DFS(k + 1)) { return true; } h[i + 1] -= 2; h[i] -= 2; } if (i + 2 < n && h[i + 2] + 1 <= m && h[i] == h[i + 1] && h[i + 1] + 1 == h[i + 2]) { h[i]++; h[i + 1] += 2; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1] -= 2; h[i]--; } } break; case 'T': for (i = 0; i < n - 1; i++) { if (h[i] + 3 <= m && h[i] + 1 == h[i + 1]) { h[i] += 3; h[i + 1]++; if (DFS(k + 1)) { return true; } h[i + 1]--; h[i] -= 3; } if (h[i + 1] + 3 <= m && h[i] == h[i + 1] + 1) { h[i]++; h[i + 1] += 3; if (DFS(k + 1)) { return true; } h[i + 1] -= 3; h[i]--; } if (i + 2 < n && h[i + 1] + 2 <= m) { if (h[i] == h[i + 1] && h[i + 1] == h[i + 2]) { h[i]++; h[i + 1] += 2; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1] -= 2; h[i]--; } if (h[i] == h[i + 1] + 1 && h[i + 1] + 1 == h[i + 2]) { h[i]++; h[i + 1] += 2; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1] -= 2; h[i]--; } } } break; case 'Z': for (i = 0; i < n - 1; i++) { if (h[i + 1] + 2 <= m && h[i] + 1 == h[i + 1]) { h[i] += 2; h[i + 1] += 2; if (DFS(k + 1)) { return true; } h[i + 1] -= 2; h[i] -= 2; } if (i + 2 < n && h[i] + 1 <= m && h[i] == h[i + 1] + 1 && h[i + 1] == h[i + 2]) { h[i]++; h[i + 1] += 2; h[i + 2]++; if (DFS(k + 1)) { return true; } h[i + 2]--; h[i + 1] -= 2; h[i]--; } } break; default :; } return false; } int main() { while (1) { scanf("%d%d", &n, &m); if (!n && !m) { break; } int i; for (i = 0; i < 10; i++) { scanf("%s", &s[i]); } memset(h, 0, sizeof(h)); if (DFS(0)) { printf("Yes/n"); } else { printf("No/n"); } } return 0; }
相关文章推荐
- 2010杭州赛区网络预赛 1006 Fate Stay Night (DP)
- [2010杭州赛区网络赛1006]Fate Stay
- hdu 4741 2013杭州赛区网络赛 dfs ***
- 2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 HDU 6212 1007 Zuma (区间DP)
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)A题 小女警的异世界之战(dfs && 分治)
- hdu 5898 odd-even number 2016ACM/ICPC沈阳赛区网络赛1007
- HDU/HDOJ 3641 Treasure Hunting 2010年杭州赛区网络赛
- 【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze
- ACM-ICPC 2018 焦作赛区网络预赛 K题 Transport Ship
- 【Author : DS & MZ】 2012 ACM-ICPC 杭州网络预赛
- HDU4415 Assassin’s Creed 2012ACM/ICPC 杭州赛区网络赛 F
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
- HDU 4582 DFS spanning tree(DFS+贪心)(2013ACM-ICPC杭州赛区全国邀请赛)
- hdu 5884 Sort 2016ACM/ICPC青岛赛区网络赛1007
- 2010成都赛区网络赛第五题---Food(hdu4292)
- 2010 ACM/ICPC Online-Contest-SCU[四川赛区网络预选赛]
- Caocao's Bridges hdu4738 (网络赛 杭州赛区) hdu 4738
- 2013年ACM网络赛杭州赛区
- hdu 4277 2012长春赛区网络赛 dfs+hashmap ***
- 【ACM-ICPC 2018 南京赛区网络预赛 J】Sum