博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3647 Tetris (暴力DFS)
阅读量:5320 次
发布时间:2019-06-14

本文共 7418 字,大约阅读时间需要 24 分钟。

题意:给你十个俄罗斯方块,问你能否拼成指定长宽的矩形,方块下落的顺序是严格确定的,后下落的方块不能落在先下落的方块之下。

每个俄罗斯方块都是由更小的小方格拼成的, 可以用一个一维数组来记录每一列已经摞上了多少个小方格。DFS遵循底部放满原则,如果可以恰好和已存在的方块实现无缝拼接才往上放,否则回溯。

#include 
#include
using namespace std;char tet[20]; //记录方块的下降次序int box[45]; //把方块分成小格子,记录每列有多个小格子int m, n;bool DFS( int cur ){ if ( cur == 10 ) return true; switch( tet[cur] ) { case 'I' : for ( int i = 0; i < n; i++ ) { if ( box[i] + 4 <= m ) //判断能不能竖着放 { box[i] += 4; if ( DFS( cur + 1 ) ) return true; box[i] -= 4; } if ( i + 3 < n && box[i] == box[i + 1] && box[i + 1] == box[i + 2] && box[i + 2] == box[i + 3] && box[i] + 1 <= m ) //能不能横着放 { for ( int j = i; j < i + 4; j++ ) ++box[j]; if ( DFS( cur + 1 ) ) return true; for ( int j = i; j < i + 4; j++ ) --box[j]; } } break; case 'O': for ( int i = 0; i < n; i++ ) { if ( i + 1 < n && box[i] == box[i + 1] && box[i] + 2 <= m ) { box[i] += 2; box[i + 1] += 2; if ( DFS( cur + 1 ) ) return true; box[i] -= 2; box[i + 1] -= 2; } } break; case 'L' : for ( int i = 0; i < n; i++ ) { if ( i + 1 < n && box[i] + 3 <= m && box[i] == box[i + 1] ) //正着放L { box[i] += 3; box[i + 1] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 3; box[i + 1] -= 1; } if (i + 2 < n && box[i] + 1 == box[i + 1] && box[i + 1] == box[i + 2] && box[i] + 2 <= m && box[i + 1] + 1 <= m ) //顺时针旋转90° { box[i] += 2; box[i + 1] += 1; box[i + 2] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 2; box[i + 1] -= 1; box[i + 2] -= 1; } if (i + 1 < n && box[i] + 1 <= m && box[i + 1] + 3 <= m && box[i + 1] + 2 == box[i] ) //顺时针旋转180° { box[i] += 1; box[i + 1] += 3; if ( DFS( cur + 1 ) ) return true; box[i] -= 1; box[i + 1] -= 3; } if (i + 2 < n && box[i] == box[i + 1] && box[i + 1] == box[i + 2] && box[i + 2] + 2 <= m ) //顺时针旋转270° { box[i] += 1; box[i + 1] += 1; box[i + 2] += 2; if ( DFS(cur + 1) ) return true; box[i] -= 1; box[i + 1] -= 1; box[i + 2] -= 2; } } break; case 'J' : for ( int i = 0; i < n; i++ ) { if (i + 1 < n && box[i] == box[i + 1] && box[i + 1] + 3 <= m ) //0 { box[i] += 1; box[i + 1] += 3; if ( DFS(cur + 1) ) return true; box[i] -= 1; box[i + 1] -= 3; } if (i + 2 < n && box[i] == box[i + 1] && box[i + 1] == box[i + 2] && box[i] + 2 <= m) //90 { box[i] += 2; box[i + 1] += 1; box[i + 2] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 2; box[i + 1] -= 1; box[i + 2] -= 1; } if (i + 1 < n && box[i] + 2 == box[i + 1] && box[i] + 3 <= m && box[i + 1] + 1 <= m ) //180 { box[i] += 3; box[i + 1] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 3; box[i + 1] -= 1; } if (i + 2 < n && box[i] == box[i + 1] && box[i + 2] + 1 == box[i + 1] && box[i] + 1 <= m && box[i + 2] + 2 <= m) //270 { box[i] += 1; box[i + 1] += 1; box[i + 2] += 2; if ( DFS(cur + 1) ) return true; box[i] -= 1; box[i + 1] -= 1; box[i + 2] -= 2; } } break; case 'Z' : for ( int i = 0; i < n; i++ ) { if (i + 2 < n && box[i + 2] == box[i + 1] && box[i + 1] + 1 == box[i] && box[i] + 1 <= m && box[i + 1] + 2 <= m ) //0 { box[i] += 1; box[i + 1] += 2; box[i + 2] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 1; box[i + 1] -= 2; box[i + 2] -= 1; } if (i + 1 < n && box[i] + 1 == box[i + 1] && box[i] + 2 <= m && box[i + 1] + 2 <= m) //90 { box[i] += 2; box[i + 1] += 2; if ( DFS( cur + 1 ) ) return true; box[i] -= 2; box[i + 1] -= 2; } } break; case 'S' : for ( int i = 0; i < n; i++ ) { if (i + 2 < n && box[i] == box[i + 1] && box[i + 1] + 1 == box[i + 2] && box[i + 1] + 2 <= m && box[i + 2] + 1 <= m ) //0 { box[i] += 1; box[i + 1] += 2; box[i + 2] += 1; if ( DFS(cur + 1) ) return true; box[i] -= 1; box[i + 1] -= 2; box[i + 2] -= 1; } if (i + 1 < n && box[i + 1] + 1 == box[i] && box[i] + 2 <= m && box[i + 1] + 2 <= m ) //90 { box[i] += 2; box[i + 1] += 2; if ( DFS(cur + 1) ) return true; box[i] -= 2; box[i + 1] -= 2; } } break; case 'T' : for ( int i = 0; i < n; i++ ) { if ( i + 2 < n && box[i] == box[i + 1] && box[i + 1] == box[i + 2] && box[i + 1] + 2 <= m ) //0 { box[i] += 1; box[i + 1] += 2; box[i + 2] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 1; box[i + 1] -= 2; box[i + 2] -= 1; } if ( i + 1 < n && box[i] + 1 == box[i + 1] && box[i] + 3 <= m ) //90 { box[i] += 3; box[i + 1] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 3; box[i + 1] -= 1; } if ( i + 2 < n && box[i] == box[i + 2] && box[i + 1] + 1 == box[i] && box[i + 1] + 2 <= m ) //180 { box[i] += 1; box[i + 1] += 2; box[i + 2] += 1; if ( DFS( cur + 1 ) ) return true; box[i] -= 1; box[i + 1] -= 2; box[i + 2] -= 1; } if ( i + 1 < n && box[i + 1] + 1 == box[i] && box[i + 1] + 3 <= m ) //270 { box[i] += 1; box[i + 1] += 3; if ( DFS( cur + 1 ) ) return true; box[i] -= 1; box[i + 1] -= 3; } } break; } return false;}int main(){ while(cin>>n>>m&&n||m) { for(int i=0; i<10; i++) cin>>tet[i]; memset(box, 0, sizeof(box)); if(DFS(0)) cout<<"Yes"<

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wanglaoda/p/4937132.html

你可能感兴趣的文章
【Linux笔记】CentOS 7 systemctl、firewalld
查看>>
SDK目录结构
查看>>
springmvc注解
查看>>
结对作业-四则运算GUI
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
jdbc oracle 连接字符串
查看>>
LLVM language 参考手册(译)(3)
查看>>
编译uboot提示libasm-offsets.c10 error bad value (armv5)解决方法
查看>>
备忘录模式实例1
查看>>
NHibernate教程(9)一1对n关联映射
查看>>
Java程序设计-v01
查看>>
js中的三种函数写法
查看>>
高精度1--加法
查看>>
Laravel框架之Response操作
查看>>
Centos-创建目录-mkdir
查看>>
Ubuntu 12.04 Firefox/Chromium缺少Flash Player问题
查看>>
在线文件管理器elFinder支持中文
查看>>
String比较
查看>>
get the code of function in matlab
查看>>