2012年第四届华为编程大赛决赛试题

touhousuika 2012-05-27 06:01:48
加精
决赛题目大概是这样:
在一个21x21的棋盘上,利用各种俄罗斯方块的图案,尽可能地填满全部棋盘。他在初始会给你额外放一个图案作为障碍,表示这个图案所在的地方已经被填上了

我一开始以为搜索就行了,但是搜索空间实在太大了,自己也想不出什么好的启发式或者剪枝算法
最后我的想法是,把大部分空间都用长条填充完,最后剩一个很小的区间再遍历。但是这样无法保证最优性,不知道这道题的正确解法是什么?

题目详细要求可以看http://blog.thpiano.com/?p=579
...全文
8044 104 打赏 收藏 转发到动态 举报
写回复
用AI写文章
104 条回复
切换为时间正序
请发表友善的回复…
发表回复
futei 2012-12-16
  • 打赏
  • 举报
回复
学习了 入门当中
xiaoyangming 2012-06-11
  • 打赏
  • 举报
回复 1
1. tetris.hC/C++ code#ifndef TETRIS_H
#define TETRIS_H
#include <vector>

using namespace std;

class Grid {
public:
Grid(): row(0), column(0) {};
Grid(int row, int column): row(row), column(column) {};
Grid(const Grid &grid): row(grid.row), column(grid.column) {};
Grid &operator=(const Grid &grid) {
if(this != &grid) {
this->row = grid.row;
this->column = grid.column;
} else
return *this;
}

int row;
int column;
};

typedef Grid (*Transform)(const Grid &grid);

class TetrisPanel {
public:
const static int ROWS = 21;
const static int COLUMNS = 21;

TetrisPanel();

void setShape(const vector<Grid> &shape);
vector<vector<int> > getOriginalPanel() const {return grids; };
void addTransformation(Transform transform) {transforms.push_back(transform); };

friend ostream &operator<<(ostream &out, const TetrisPanel &panel);

private:
vector<vector<int> > grids;
vector<Transform> transforms;
int sequence;

const static int EMPTY = 0;

Grid transform(const Grid &grid) const;
int getSequence() {return sequence++;};

TetrisPanel(const TetrisPanel&);
void operator=(const TetrisPanel&);
};

ostream &operator<<(ostream &out, const TetrisPanel &panel);

#endif
kooyou68 2012-06-10
  • 打赏
  • 举报
回复
算法,是心中永远的痛
Jarrylogin 2012-06-10
  • 打赏
  • 举报
回复
To ssd189:
C++ STL 用的好标准啊!
clevise 2012-06-10
  • 打赏
  • 举报
回复
纯学习,拜读了
用眼神瞬杀你 2012-06-09
  • 打赏
  • 举报
回复
Ptrtoptr 2012-06-09
  • 打赏
  • 举报
回复
都 是大神 ,进来学习学习
zuxianghuang 2012-06-09
  • 打赏
  • 举报
回复
哎,菜鸟来学学
tianyang2008 2012-06-08
  • 打赏
  • 举报
回复
想想也对,任何一种障碍都能通过图形组成4×3或者3×4的方块。剩下的部分都填成1×4,2×4的东西。真好
逆推 2012-06-07
  • 打赏
  • 举报
回复
高手!!
SSH198 2012-06-07
  • 打赏
  • 举报
回复
没看懂
qw2283345 2012-06-07
  • 打赏
  • 举报
回复
太打击人了,真是高手如云啊,我都晕呼呼的
a12345_asdfg 2012-06-07
  • 打赏
  • 举报
回复
额,高手们啊,都太厉害了。。。
liufcomce36 2012-06-07
  • 打赏
  • 举报
回复
菜鸟压力大啊。。。。
woaiwuxia 2012-06-07
  • 打赏
  • 举报
回复
看着就眼晕啊
everfighting 2012-06-06
  • 打赏
  • 举报
回复
惭愧!
xyplcxsydn 2012-06-06
  • 打赏
  • 举报
回复
看到代码有点头大了~~~不过还是顶一个~~~~~~~~~~~~~~~·
Adosea 2012-06-05
  • 打赏
  • 举报
回复
高手在民间
dongpy 2012-06-05
  • 打赏
  • 举报
回复
先用长条填满无障碍的21*21,留下一个空格。

然后抠出障碍物所在区域的长条,重新排列。

根据障碍物横坐标X%4的值,分4种情况(最多需抠出3*8大小的区域)。
seanma2001 2012-06-05
  • 打赏
  • 举报
回复
看看,学习一下
加载更多回复(59)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧